异步servlet请求loadbalancer超时

cfh9epnr  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(405)

我使用java异步servlet来执行长时间运行的任务,这些任务是使用weblogic中部署的jersey实现的。

@GET
   @Path("/asyncjob")
   @Produces(MediaType.TEXT_PLAIN)
   public void asyncJob(@Suspended final AsyncResponse asyncResponse) {

      ExecutorService executor = Executors.newFixedThreadPool(1);

      executor.execute(() -> {
           String result = longRunningTask();
           asyncResponse.resume(result);
      });
   }

我通过javascript ajax调用调用上面的restapi。
这在开发环境中运行良好。但是,我被告知,即使任务在weblogic中以异步方式在一个单独的线程中处理,这在实际生产中也不会起作用,因为loadbalancer将在默认超时时间之后超时,并将终止客户端连接。
我们还没有机会在类似于产品的环境中测试它。但据我所知,一旦启动异步作业,处理web请求的主weblogic线程就会返回。作业完成后,将使用另一个线程提交响应,此时是服务器推送。所以在这个服务器推送通知期间,loadbalancer timeout是否仍然适用?
如果loadbalancer实际超时,那么这就违背了异步servlet的目的,因为它不适用于任何实际的生产应用程序。有没有解决负载平衡器超时问题的方法?我们还有什么选择?

au9on6nz

au9on6nz1#

从客户机的Angular 来看,此上下文中的异步并不是真正的异步。客户端(javascript)将等待响应。async servlets/jax-rs是让线程保持忙碌,而不是让线程在等待数据写入时被阻塞。
为了与javascript客户机进行真正的异步通信,您应该在jax-rs中查找sse或使用websockets。
下面是对sse的一个很好的介绍

相关问题