2017-10-08 35 views
4

使用Netbeans并编写任意REST端点时,NetBeans始终显示警告,表明该方法可以转换为异步。Java EE中应该每个REST端点都是异步的吗?

例如,我创建以下方法:

@GET 
@Path("/test") 
public String hello() { 
    return "Hello World!"; 
} 

的NetBeans然后显示一个警告,见下文:

Convert to asynchronous

点击工具提示生成此代码:

private final ExecutorService executorService = java.util.concurrent.Executors.newCachedThreadPool(); 

@GET 
@Path(value = "/test") 
public void hello(@Suspended final AsyncResponse asyncResponse) { 
    executorService.submit(new Runnable() { 
     @Override 
     public void run() { 
      asyncResponse.resume(doHello()); 
     } 
    }); 
} 

private String doHello() { 
    return "Hello World!"; 
} 

创建PUT时同样如此或POST方法。由于在实现REST端点时NetBeans总是显示警告,这告诉我编写同步端点被认为是错误/不正确的做法。那么,每个REST端点应该是异步的吗?为什么?

+0

会发生什么,如果两个用户请求同时访问相同的资源? –

+0

据我所知,服务器的线程池中有多个线程可用。每当有新的请求进入时,服务器都会将其中一个线程分配给该请求,并在处理完请求(不管访问哪个资源)后将线程释放到池中。这也意味着默认情况下JAX-RS是线程安全的。 – Jakob

+0

什么是您的netbeans版本? – user7294900

回答

1

默认情况下,在服务器上请求的处理在同步 模式下工作,这意味着每个请求在单个HTTP 线程处理。当请求处理完成后,线程返回到线程池 。当资源方法 执行时间短并且并发连接数 相对不是很高时,这不是很重要。在异步模式下,在请求处理完成之前,线程返回到线程池 。 然后在另一个线程中继续请求处理,称为 Worker。释放的I/O线程可用于接受新的传入请求。在很多情况下,只有几个线程可以同时处理大量的请求,因此处理传入请求所需的线程数量可以显着减少。通过使用少了很多 线程,我们都节省内存,提高性能(通过减少 线程上下文切换)

这可能会清除你的困惑一点bit.Have看看这个link

+0

感谢您的回复,但我仍然完全不理解它。如果我只是将工作负载从HTTP线程中继到工作线程,那么如果所有工作线程都忙碌,这仍不会提高性能。只要我不等待其他资源(DB,API),工作线程就应该忙于请求完成。由于I/O线程的原因,我只能接受更多的请求,但如果这些请求无法完成,那不会对我有所帮助 – Jakob

相关问题