在调用者线程结束后,我可以让它被授予EJB @asynchronous方法的线程吗?

时间:2014-02-24 23:29:30

标签: multithreading asynchronous ejb ejb-3.1

我想在MDB的onMessage结束后创建一些进程。

我认为我可以使用EJB的@asyncronous来实现它。但我担心这个方法可以在调用者线程结束之前启动。

有没有办法确保这个异步方法在调用者线程结束后启动,至少调用者线程提交它自己的事务。

谢谢,美好的一天。

1 个答案:

答案 0 :(得分:1)

您可以通过使用其他MDB来实现此目的,如果您从事务中发布消息,则在提交发布者事务之前不会发布消息:

@MessageDriven...
public class MDB1 {

  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void onMessage(Message message) {
    ...
    producer.send(msg1); // msg1 will be published at commit of this transaction
    ...
    myMethod1();
  }
}

和,

@MessageDriven... // Consumes msg1
public class MDB2 {

  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void onMessage(Message message) {
    ...
    myMethod2();
    ...
  }
}

这种方式(并使用CMT),在msg返回之前不会发布消息MDB1.onMessage(),因此在MDB2.myMethod2()返回之前永远不会执行MDB1.onMessage()