我使用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的目的,因为它不适用于任何实际的生产应用程序。有没有解决负载平衡器超时问题的方法?我们还有什么选择?
1条答案
按热度按时间au9on6nz1#
从客户机的Angular 来看,此上下文中的异步并不是真正的异步。客户端(javascript)将等待响应。async servlets/jax-rs是让线程保持忙碌,而不是让线程在等待数据写入时被阻塞。
为了与javascript客户机进行真正的异步通信,您应该在jax-rs中查找sse或使用websockets。
下面是对sse的一个很好的介绍