Java 在servlet中运行多线程

Java 在servlet中运行多线程,java,multithreading,jakarta-ee,servlets,Java,Multithreading,Jakarta Ee,Servlets,我有两个进程(调用第三方服务并获取响应、查询数据库并获取结果、执行一些IO操作等)要在我的servlet中执行。此外,这些进程非常耗时,如果第三方呼叫(第一个进程)响应失败,则其他进程也应终止 我将使用执行器作为多线程运行所有这些进程。一旦第一个进程的响应可用,servlet就应该发送响应(重定向到页面)。当所有进程的其余部分完成时,输出应该再次发送到该页面(类似于推送到浏览器),或者重定向到另一个页面(但随后希望访问已经运行的其余线程) 我的第一次尝试是从浏览器发送ajax请求并处理所有这些进

我有两个进程(调用第三方服务并获取响应、查询数据库并获取结果、执行一些IO操作等)要在我的servlet中执行。此外,这些进程非常耗时,如果第三方呼叫(第一个进程)响应失败,则其他进程也应终止

我将使用执行器作为多线程运行所有这些进程。一旦第一个进程的响应可用,servlet就应该发送响应(重定向到页面)。当所有进程的其余部分完成时,输出应该再次发送到该页面(类似于推送到浏览器),或者重定向到另一个页面(但随后希望访问已经运行的其余线程)


我的第一次尝试是从浏览器发送ajax请求并处理所有这些进程。但它不太安全。因此,请告诉我运行这些线程的方法,在第一个进程完成后,发送响应,然后返回其余的输出。

在这种情况下,我的建议是使整个页面异步。send request,启动线程并立即返回。线程可以填充会话中包含的公共对象、写入文件或数据库。完成后,设置一个标志以显示来自客户端的任何后续请求(轮询请求等),表明您已完成,并且可以生成页面


您可以以各种方式显示临时页面(“Check back”消息、使用进度条轮询等)。

在了解我们必须支持哪个IE版本后,有两个选项

  • 使用基于AJAX的实现
  • 使用AJAX和HTTP POST,逐个触发您的服务。还要确保承诺得到维护,以保持请求的干净状态。如果您也必须遵循完成顺序,也可以使用AJAX链接。请注意AJAX本身没有安全限制(请参阅),它只是一个API,使用HTTP方法以异步方式调用服务器。因此,如果您的服务器具有安全性,AJAX可以/需要继承该安全性

  • 使用基于WebSocket的实现

  • 由于IE8本机不支持websocket,您可以使用自定义api,如。请注意,这将带来一些兼容性问题,但目前没有明显的影响。调用servlet将触发不同的线程,并在线程完成后发回数据。如果您的服务器的se中有websocket-api.jar然后,您可以非常轻松地对其服务器端进行编码。请参见

    您不能推送到浏览器,您必须从browser@NitinDandriyal您可以使用WebSocket或SSE(服务器发送事件)推送到客户端…你的应用程序是HTML5并且支持websockets吗?@Aksapy。谢谢你的回答。我必须支持旧的IE版本,我不能使用HTML 5。但是,像你这样的需求正是ajax和websockets发明的原因。谢谢你的回答。但是我有一些担心。我不直接使用HttpSession,也不确定负载均衡器是否会重定向到e请求到哪个服务器(无粘性会话)。如果没有粘性会话,则只剩下持久会话。因此线程会收集结果并写入数据库。非常感谢。Websocket需要HTTP 5..:(+JavaEE7你是指HTML5吗?不,这是我在2选项第一个链接中给出的。你也可以用作服务器端的启动,它不需要JavaEE7,但我没有尝试