使用JMS进行长时间运行的流程?

时间:2010-08-11 17:29:38

标签: java jms

有人可以指向一个教程或类似的代码,其中Web应用程序使用JMS来执行长时间运行的后台进程吗? (而不是使用线程),我对JMS消息传递的概念非常熟悉,但从未使用任何JMS API或代理(我正在研究Apache ActiveMQ)

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

谢谢!

2 个答案:

答案 0 :(得分:2)

在上下文中使用JMS的真正目的是异步启动任务。这被称为fire and forget in middleware lingo。 JMS保证了传递语义,这意味着一旦消息被放入队列,就可以保证最终到达那里......

您的想法是执行您需要执行的任何任务,如果您在此过程中有任何可以在以后完成的任务,那么您将在队列中放置一条消息,然后它将执行。这允许您在有人等待响应的同时减少大量处理。

JMS的另一个好处是系统的不同部分不需要同时运行。消费消息的部分可能会停止维护,而前端仍然有效。

答案 1 :(得分:1)

以前的帖子在模型方面是准确的,可以将订单或请求异步地放入队列中,然后再将其取出。但是,它并没有真正解决长时间运行的问题。

就队列和主题而言,持久性队列的好处是,如果队列中没有消费者,则消息将等待消费,直到有订户。在主题中,您需要创建一个持久订阅,以确保未连接的使用者将在重新连接后接收在其缺席时发送的消息。

那么,你如何定义一个长期运行的过程呢?对于多步骤流程,您通常会使用类似工作流引擎的方法。有一些选项,如BPM工具或类似“OS Workflow”的选项。你也可以做一个本土解决方案,看起来像下面的例子

1)需要某种工作流定义来定义流程中的步骤。这可以是属性文件或XML文件。 2)Web App在队列或主题(pub / sub)上放置一条消息,指示要执行的进程(或者您可以为不同的进程设置特定的目标) 3)Dispatcher MDB从队列中选择“订单”状态为“NEW”并开始处理第一步。 4)一旦完成该步骤,MDB就会在队列中放置一条新消息,指示正在执行的进程以及要执行的下一步,或者执行的最后一步(取决于您希望进程的确定性) 5)MDB接收消息并发现该过程为“IN_PROGRESS”。它要么确定要执行的下一步,要么从消息中读取下一步要执行的步骤(JMS头值或消息内,可能是XML格式) 6)步骤4&重复5,直到流程实例完成

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

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

使用包含JPA的Java EE6技术,您可以轻松创建XSD,使用JAXB生成域数据模型POJO,并使用JPA进行持久化。我们在今年早些时候进行了一次网络广播,其中涵盖了WebLogic目前支持的JEE6技术。以下是重播:http://www.oracle.com/technetwork/middleware/weblogic/learnmore/weblogic-javaee6-webcasts-358613.html

我还有兴趣和你谈谈你的JBoss迁移:) jeffrey.west@oracle.com