【问题标题】:Run multi threads in servlets在 servlet 中运行多线程
【发布时间】:2015-08-08 02:59:03
【问题描述】:

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

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

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

【问题讨论】:

  • 不能推送到浏览器,必须从浏览器拉取
  • @NitinDandriyal 好吧,您可以使用 WebSockets 或 SSE(服务器发送事件)推送到客户端...
  • 你的应用是 HTML5 并且支持 websockets 吗?
  • @aksappy。感谢您的回复。我必须支持旧的 IE 版本,我不能使用 HTML 5。
  • 但是,像您这样的需求正是发明 ajax 和 websockets 的原因

标签: java multithreading jakarta-ee servlets


【解决方案1】:

知道要支持哪个IE版本后有两种选择

  1. 使用基于 AJAX 的实现。

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

  1. 使用基于 websockets 的实现

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

【讨论】:

  • 非常感谢。 Websocket 需要 HTTP 5 .. :( + java ee 7
  • 你说的是 HTML5 吗?不,这就是我在 2 选项第一个链接中给出的内容。您也可以使用github.com/TooTallNate/Java-WebSocket 作为服务器端的启动,这不需要Java EE7,但我没有尝试过
【解决方案2】:

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

您可以通过多种方式呈现临时页面(“检查回来”消息、使用进度条进行轮询等)。

【讨论】:

  • 谢谢你的回答。但我有些担心。我不直接使用 HttpSession 并且不确定负载均衡器将请求重定向到哪个服务器(没有粘性会话)。
  • 如果您没有粘性会话,则剩下的是持久会话。所以线程收集结果并写入数据库。
猜你喜欢
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多