异步Servlet请求负载均衡器超时

问题描述

我正在使用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调用调用上述rest api。

这在开发环境中工作正常。但是,有人告诉我,即使任务是在单独的线程中在weblogic中异步处理的,也不能在实际生产中使用,因为负载平衡器将在认超时时间后超时,并终止客户端连接。

我们还没有机会在类似生产的环境中对其进行测试。但是据我了解,一旦启动异步作业,处理Web请求的主要weblogic线程就会返回。作业完成后,将使用其他线程来提交响应,这时是服务器推送。因此,在此服务器推送通知期间,是否仍然适用loadbalancer超时?

如果loadbalancer实际上超时,则将违反异步servlet的目的,因为它不适用于任何实际的生产应用程序。有没有解决负载平衡器超时问题的解决方案?我们有什么选择?

解决方法

从客户端的角度来看,

在这种情况下,异步并不是真正的异步。客户端(javascript)将等待响应。异步servlets / JAX-RS的目的是保持线程繁忙,而不会阻塞线程以等待数据被写入。

要与javascript客户端进行真正的异步通信,您应该在JAX-RS中查找SSE或使用WebSockets。

Here is a nice introduction to SSE