Asynchronous JAXRS异步服务

Asynchronous JAXRS异步服务,asynchronous,jakarta-ee,jax-rs,Asynchronous,Jakarta Ee,Jax Rs,以下是Jersey异步服务的示例代码: @Path("/resource") public class AsyncResource { @GET public void asyncGet(@Suspended final AsyncResponse asyncResponse) { new Thread(new Runnable() { @Override public void run() {

以下是Jersey异步服务的示例代码:

@Path("/resource")
public class AsyncResource {
    @GET
    public void asyncGet(@Suspended final AsyncResponse asyncResponse) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = veryExpensiveOperation();
                asyncResponse.resume(result);
            }

            private String veryExpensiveOperation() {
                // ... very expensive operation
            }
        }).start();
    }
}

考虑到容器已经负责将连接处理线程释放回池并将请求处理交给工作线程,我想知道为什么我们仍然需要以编程方式生成新线程?这不应该只是容器配置设置工作线程数的问题吗?

没有必要像这样spwan一个新线程。如果您在JavaEE环境中,只需在方法中放置@Asynchronous注释:

@GET
@Asynchronous
public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
        String result = veryExpensiveOperation();
        asyncResponse.resume(result);
}
如果您需要扩展线程池,还可以查看ManagedExecutorService

这不应该只是容器配置设置工作线程数的问题吗

实际上,您可以配置容器工作线程的数量,但您仍然受到它们的约束。如果您有10个容器线程,那么您可以同时处理10个请求。如果有100个线程,那么可以同时有100个请求

另一方面,异步web请求将请求/响应对象解耦,jax-rs在从工作线程部署servlet容器时在下面使用servlet。因此,您可以有10个线程,但例如1000个请求将继续读取

我想知道为什么我们仍然需要以编程方式生成一个新线程

如果仍然要在同一个线程中处理请求,那么将请求与线程分离是毫无意义的,因为在这种情况下,异步/同步请求之间绝对没有区别

此外,您不需要生成新线程。事实上,这是一个可怕的解决方案。线程创建是昂贵的。相反,您应该将可运行程序提交到线程池

那么异步请求有什么好处呢?它们适用于需要大量时间才能完成的操作。做下面的实验

将tomcat或您选择的服务器配置为使用10个线程池。 让你的资源只睡10秒钟。 尽可能多地请求它。 使您的资源异步,而不是在其中等待,将只需等待10秒的可运行程序提交到线程池->您现在可以发出多少请求?
不是那么简单。首先,必须将该资源标记为EJB。第二:您需要一个完整的配置文件服务器,因为web配置文件不支持@Asynchronous是的,我忘了提到AsynchResource需要是一个EJB。您还可以将异步方法放置到单独的EJB中。