Jakarta ee 调度类或编写队列

Jakarta ee 调度类或编写队列,jakarta-ee,timer,jms,scheduled-tasks,timertask,Jakarta Ee,Timer,Jms,Scheduled Tasks,Timertask,我的需求是处理java类中长时间运行的方法,当用户提交按钮时调用该方法 我需要做一些比较逻辑,这将需要很长的时间来处理,我需要一个建议,我应该使用消息队列还是使用计时器/调度器,它将在每“n”分钟/小时调用代码,并在不同的线程中进行处理 最好的方法是什么?在什么情况下我会使用 谢谢 如果您的频率不是很高(1分钟),那么从数据库中的浏览器进行轮询是可以的,特别是如果您的应用程序中已经有一个数据库,一个像Quartz这样的作业调度器,并且您“仅”使用一个servlet容器 如果响应时间很重要,考虑使

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

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

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

谢谢

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

  • 作为替代方案,使用JMS队列和消息驱动bean(MDB)替换数据库和调度器。主要区别在于编程模式:不是轮询,而是你的接收者收听:他们得到通知。通过这种方式,框架可以选择实现消息传递的最佳方法。除了一个标准的servlet容器之外,您现在还需要一个JMS提供程序,可能还需要一个EJB容器
  • 您还可以将其与异步servlet相结合
如果在第一种方法中不使用数据库:JMS支持即时持久消息,队列通过缓冲消息来解耦客户机和工作机。这简化了系统维护:您可以使用worker更新应用程序,而不会中断客户端

更新

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

比如说

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

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

    您的问题太广泛:定义“最佳”。你的客户端是什么(浏览器、单机应用)?所以答案是“视情况而定”。@Beryllium感谢您的回复。我有一个web应用程序在应用服务器上运行,我有一个web表单,用户可以在其中单击一个按钮来执行长时间运行的流程。由于我是JMS新手,请告诉我侦听器是否收到通知,然后开始处理,如果我单击web应用程序中的其他链接,控件转到另一个控制器,处理是否会停止…或者侦听器将在单独的线程中工作…并继续处理,假设侦听器类处于同一个WAR中。@ManishSahni我在答案中添加了一个示例。把信息传递想象成邮政服务:你有一封信,把它放在信箱里,接下来的几天你就等着邮递员了。三天后,他给了你回复(另一封信)。所以一旦你把信放进信箱,你就不能打断它,你必须等待。当然,收信人可以随意丢弃你的信,也可以随意不回复。哇,这是一个清晰而伟大的解释。这确实有助于理解这个概念。