在servlet中运行多线程

时间:2015-05-26 12:23:11

标签: java multithreading java-ee servlets

我有几个进程(调用第三方服务并获得响应,查询数据库并获取结果,执行一些IO操作等)以在我的servlet中执行。而且,这些过程是耗时的,如果第三方调用是第一个过程,响应失败,其余的过程也应该终止。

我将使用Executors将所有这些进程作为多线程运行。尽快,第一个进程的响应可用,servlet应发送响应(重定向到页面)。当剩下的所有进程都完成后,输出应该再次发送到页面(类似于推送到浏览器),或者重定向到另一个页面,(但是然后想要访问已经运行的其余线程。< / p>

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

2 个答案:

答案 0 :(得分:2)

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

您可以通过各种方式呈现临时页面(&#34;检查&#34;消息,使用进度条轮询,等等)。

答案 1 :(得分:1)

在知道我们必须支持哪个IE版本后,有两个选择

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

    1. 使用基于websockets的实现
    2. 由于IE8本身不支持websockets,因此您可以使用自定义API,例如this。请注意,这将有一些兼容性问题,但目前没有明显的影响。调用将触发不同线程的servlet,并在完成线程后发回数据。如果您的服务器在其服务器库中有websocket-api.jar,那么您可以非常轻松地对服务器端进行编码。见here