如何解决异步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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。