【问题标题】:Scheduling a Class or Writing a queue安排课程或编写队列
【发布时间】:2013-09-14 16:08:14
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 您的问题过于宽泛:定义“最佳”。您的客户端是什么(浏览器、独立应用程序)?所以答案是“视情况而定”。
  • @Beryllium 感谢您的响应。我有一个在应用服务器上运行的 Web 应用程序,我有一个 Web 表单,用户可以在其中单击一个按钮来执行长时间运行的过程。跨度>

标签: jakarta-ee timer jms scheduled-tasks timertask


【解决方案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 调用,则用户不会看到您实际上是在轮询。

【讨论】:

  • 因为我是 JMS 的新手,请告诉我如果监听器收到通知然后开始处理,如果我点击我的 Web 应用程序中的其他链接并且控制转到另一个控制器...或侦听器将在单独的线程中工作...并继续处理,假设侦听器类在同一个 WAR 中。
  • @ManishSahni 我在答案中添加了一个示例。将消息传递想象为邮政服务:您有一封信,将其放入信箱,然后接下来的几天您正在等待邮递员。三天后,他给你回信(另一封信)。所以一旦你把信放在信箱里,就不能打断它,你必须等待。收信人当然可以随意丢弃你的信,也可以完全不回复。
  • 哇,这是一个清晰而伟大的解释......它确实有助于理解这个概念。
猜你喜欢
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2018-07-15
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多