Jms 如何启动长时间运行的JavaEE作业?

Jms 如何启动长时间运行的JavaEE作业?,jms,ejb-3.1,jboss-mdb,Jms,Ejb 3.1,Jboss Mdb,我需要启动一个长时间运行的批处理类型的作业,很长时间以来,我们正在讨论一个可能需要几个小时的作业。具有运行此长时间运行作业的逻辑的ejb将与NoSQL存储和加载数据等通信 因此,我使用JMS MDB异步地完成这项工作。但是,由于每个作业可能需要一个小时或更长时间(假设最多4小时),我不希望MDB中的onMessage()方法等待这么长时间。因此,我考虑在onMessage()MDB方法中启动一个异步ejb,以便在调用批处理ejb运行程序之后立即将MDB返回到池中 将异步ejb方法调用与MDB结合

我需要启动一个长时间运行的批处理类型的作业,很长时间以来,我们正在讨论一个可能需要几个小时的作业。具有运行此长时间运行作业的逻辑的ejb将与NoSQL存储和加载数据等通信

因此,我使用JMS MDB异步地完成这项工作。但是,由于每个作业可能需要一个小时或更长时间(假设最多4小时),我不希望MDB中的onMessage()方法等待这么长时间。因此,我考虑在onMessage()MDB方法中启动一个异步ejb,以便在调用批处理ejb运行程序之后立即将MDB返回到池中

将异步ejb方法调用与MDB结合起来有意义吗?大多数示例建议使用1或另一个来实现相同的目标

如果要从MDB调用的ejb不是异步的,那么MDB将等待很长时间


请告知。

我想这是口味的问题

如果您有一个来自JMS池的线程在运行您的作业,或者如果您有一个异步ejb来执行此操作,那么最终结果将是相同的——一个线程将被某个池阻塞


从MDB生成异步bean没有什么错,因为您可能希望由消息传递接口触发作业,但可能不希望阻止线程池。此外,考虑到事务通常在一小时前以缺省方式超时,因此,如果您通过某种原因进行MDB事务处理,您可能会考虑在OnMead中对该异步EJB进行火灾。

< P>我认为Petter回答了大部分问题。如果您只是使用mdb来获得异步行为,那么您可以尽快启动@Asynchronous

但是,如果您对JMS实现可能提供的可靠性、持久队列、慢用户策略、作业优先级等其他特性感兴趣,那么您应该坚持使用mdb:s


在EJB3.1中引入@Asynchronous的原因之一是,在不需要其他JMS/MDB功能时,提供一种更轻量级的异步处理方式。

我会简化一些事情:使用@Schedule调用@Asynchronous,忘掉JMS。少了一件可能出错的事情

虽然还没有准备好进入黄金时段,但JSR352:批处理应用程序对于这类东西看起来非常有希望


谢谢你,彼得。因此,一般来说,我认为使用onMessage(mdb的)从启动异步bean将防止mdb从池中被阻塞,这是正确的吗?这就是我想要的,但你是对的,异步ejb本身无论如何都会阻止线程,但至少有一个消息传递接口来启动作业还有一件事,mdb不会是事务性的。我应该在从mdb调用的异步ejb中设置一个超时标志,还是在这种情况下从mdb调用?谢谢Aksel。我一直认为mdb被阻塞数小时是一件坏事,这就是为什么我想到从mdb内部调用异步ejb方法来立即释放它。也许我在这里是错误的,可以让mdb等到大容量加载作业完成。就像你说的,在这种情况下我可以利用其他mdb特性。嗨,Andre,你的答案现在是相关的,因为JSR352现在已经成熟了。但是,在此版本中,似乎无法从JMS消息侦听器启动批处理作业
BatchRuntime.getJobOperator().start(“作业id”,new Properties())
批处理作业卡在启动状态