我需要解雇一个长期运行的批处理类型的工作,而且很长一段时间我们都在谈论一项可能需要几个小时的工作。具有运行此长时间运行作业的逻辑的ejb将与NoSQL存储通信并加载数据等。
所以,我正在使用JMS MDB异步执行此操作。但是,由于每个作业可能需要长达一个小时或更长时间(假设最多4小时),我不希望MDB中的onMessage()方法等待这么久。所以我想在onMessage()MDB方法中触发异步ejb,以便在调用批处理ejb运行程序后立即将MDB返回到池中。
将异步ejb方法调用与MDB结合起来是否有意义?大多数样本建议使用1或其他方法来实现相同的目标。
如果要从MDB调用的ejb不是异步的,则MDB将等待可能很长时间。
请告知。
答案 0 :(得分:2)
我会简化一些事情:使用@Schedule调用@Asynchronous并忘记JMS。少一点可能出错。
虽然尚未准备好迎接黄金时段,但JSR 352:Batch Applications对于这类产品看起来非常有希望。
https://blogs.oracle.com/arungupta/entry/batch_applications_in_java_ee
答案 1 :(得分:1)
我想这是一个品味问题。
如果你有一个来自运行你的作业的JMS池的线程,或者如果你有异步ejb,那么最终结果将是相同的 - 一个线程将被阻塞在某个池中。
从MDB生成异步bean并没有错,因为您可能希望让消息传递接口触发作业,但您可能不想阻止线程池。另外,考虑到事务通常在一小时之前默认超时,因此如果由于某种原因进行MDB事务处理,您可能需要考虑在onMessage中触发该异步ejb。
答案 2 :(得分:1)
我认为Petter回答了大部分问题。如果您只使用mdb来获取异步行为,则可以尽快触发@Asynchronous。
但是如果您对JMS实现可能提供的任何其他功能感兴趣,那就是可靠性,持久性队列,缓慢的消费者策略,优先考虑的工作,你应该坚持mdb:s
在ejb 3.1中引入@Asynchronous背后的原因之一是在不需要其他JMS / MDB功能时提供更轻量级的异步处理方式。