Java 将JMS用于长时间运行的流程?

Java 将JMS用于长时间运行的流程?,java,jms,Java,Jms,有人能告诉我一个教程或类似的代码,其中web应用程序使用JMS来执行长时间运行的后台进程吗?(而不是使用线程),我非常熟悉JMS消息传递的概念,但从未使用过任何JMS API或代理(我正在学习ApacheActiveMQ) 我希望能够: 向队列提交消息以运行进程 在任意时间检查该进程的状态(进度) 谢谢 在上下文中使用JMS的真正意义在于异步启动任务。这在中间件术语中被称为“火与忘”。JMS保证了传递语义,这意味着一旦消息被放入队列,它就保证到达队列。。。最终 其思想是,您可以执行任何需要执行的

有人能告诉我一个教程或类似的代码,其中web应用程序使用JMS来执行长时间运行的后台进程吗?(而不是使用线程),我非常熟悉JMS消息传递的概念,但从未使用过任何JMS API或代理(我正在学习ApacheActiveMQ)

我希望能够: 向队列提交消息以运行进程 在任意时间检查该进程的状态(进度)


谢谢

在上下文中使用JMS的真正意义在于异步启动任务。这在中间件术语中被称为“火与忘”。JMS保证了传递语义,这意味着一旦消息被放入队列,它就保证到达队列。。。最终

其思想是,您可以执行任何需要执行的任务,如果流程中有任何任务可以在以后执行,则将消息放入队列中,稍后它将执行。这允许您在有人等待响应时大幅减少处理


JMS的另一个好处是系统的不同部分不需要同时运行。在前端仍然工作的情况下,消耗消息的部分可以停机维护。

前一篇文章就异步将订单或请求放入队列,然后稍后再提取它们的模型而言是准确的。然而,它并没有真正解决长时间运行进程的问题

就队列和主题而言,持久队列的好处在于,如果队列上没有使用者,则消息将等待使用者,直到有订阅者为止。在主题中,您需要创建一个持久订阅,以确保未连接的使用者在重新连接后将收到在其不存在的情况下发送的消息

那么,您如何定义长期运行的流程?对于多步骤流程,您通常会使用工作流引擎之类的东西。有BPM工具或“操作系统工作流”之类的选项。你也可以做一个自产的解决方案,看起来像下面的例子

1) 需要某种工作流定义来定义流程中的步骤。这可以是属性文件或XML文件。 2) Web应用程序将消息放在队列或主题(发布/订阅)上,并指示要执行的进程(或者您可以为不同的进程指定特定的目标) 3) Dispatcher MDB从队列中拾取状态为“NEW”的“order”,并开始处理第一步。 4) 一旦该步骤完成,MDB将在队列上放置一条新消息,指示正在执行的流程以及要执行的下一个步骤或执行的最后一个步骤(取决于您希望流程具有多大的确定性) 5) MDB拾取消息,并看到进程正在“进行中”。它要么确定要执行的下一步,要么从消息中读取下一步要执行的步骤(JMS头值或消息中的步骤,可能是XML格式) 6) 重复步骤4和5,直到流程实例完成

在这种情况下,您将需要订单和流程实例信息的外部表示。这将允许您检查来自WebApp的请求的状态。您的订单需要在流程的每个步骤后读取并保持更新状态,以便WebApp可以访问状态信息

此体系结构的关键组件是dispatcher MDB,它侦听消息并执行流程的下一步。当我使用操作系统工作流时,这是缺少的一个关键部分。通过这种方式,您可以通过控制池中MDB的数量和队列上的使用者来控制执行流程步骤的线程数量。在这个架构中,我建议在工作流步骤的主题上使用队列。但是,在每个处理步骤之后,您可以将消息发布到主题,以便订阅者获得更新的状态信息

使用包括JPA在内的JavaEE6技术,您可以轻松创建XSD,使用JAXB生成域数据模型POJO,并使用JPA进行持久化。今年早些时候,我们进行了一次网络广播,内容涵盖了WebLogic目前支持的JEE6技术。以下是重播:


我仍然有兴趣与您讨论JBoss迁移:)jeffrey。west@oracle.com

谢谢,有没有关于在面向消息的体系结构中使用JMS的示例?另外,对于这种方法,您会推荐使用发布/订阅方法还是排队方法,为什么?@wsb3383您找到过类似的教程吗?我也在看同样的事情。希望使用JMS处理长时间运行的存储过程。