0

我的要求是处理 java 类中的长时间运行方法,当用户提交按钮时调用该方法。

我需要做一些比较逻辑,这需要很长时间来处理,我需要一个建议是我应该使用消息队列还是我应该使用 Timer/Scheduler,它会在每“n”分钟/小时内调用一次代码并执行在不同的线程中处理。

什么是最好的方法,在什么情况下我会使用?

谢谢

4

1 回答 1

1
  • 如果您的频率不是那么高(1 分钟),从数据库中的浏览器轮询是可以的,特别是如果您的应用程序中已经有一个数据库,一个像 Quartz 这样的作业调度程序,并且您“仅”使用一个 servlet 容器。
  • 如果响应时间很重要,请考虑使用异步 servlet。同样在服务器端,一个线程可以轮询数据库,并有效地处理多个客户端。

至于 JMS

  • 作为替代方案,用 JMS 队列和消息驱动 bean (MDB) 替换数据库和调度程序。主要区别在于编程模型:您的接收者不是轮询,而是监听:他们得到通知。这样框架可以选择最好的方法来实现消息传递。除了标准的 servlet 容器之外,您现在还需要一个 JMS 提供者,并且可能还需要一个 EJB 容器。
  • 您也可以将其与异步 servlet 结合使用。

如果您在第一种方法中不使用数据库:JMS 支持开箱即用的持久消息,并且队列通过缓冲消息将客户端和工作人员解耦。这简化了系统维护:您可以在不中断客户端的情况下使用工作人员更新应用程序。

更新

消息发送者和接收者被消息解耦(它是异步的)。因此,接收器中的处理不会因用户界面中的任何操作而停止。

例如

  1. servlet 发送消息。它立即向用户/浏览器返回 HTML 响应:“任务已提交”。它是异步的,因为它不等待结果。
  2. 接收方获取消息,并开始处理,例如其onMessage方法中的 MDB
  3. HTML 页面被刷新:servlet 现在检查响应队列中是否有消息。到目前为止还没有,所以它返回“尚未完成”。
  4. 接收方已完成计算,并将结果作为消息放入结果队列。
  5. HTML 页面被刷新:现在有一条消息,它会将结果呈现给用户。

如果您将检查实现为 AJAX 调用,则用户不会看到您实际上是在轮询。

于 2013-09-14T18:23:30.837 回答