0

我有一个 Bean 管理的MDB -InvoiceInquiryMessageBean,它具有以下定义,它调用一个CMT - InvoiceManager ,它执行数据库操作。

MDB 被明确提到为Bean 托管,并且 onMessage() 有一个事务NOT_SUPPORTED。因此,此 MDB 在没有事务划分的情况下运行。

下面的 InvoiceManager bean没有定义事务类型或事务属性。因此默认情况下,它是一个容器管理的 CMT ,并且默认情况下具有REQUIRED事务类型。此bean 执行数据库操作。问题是

问题 #1

如果在执行数据库操作时出现任何错误/异常,例如(违反主键,数据库死锁,如 SQL 服务器错误代码 1205),则认为数据库事务失败。此数据库事务失败是否会影响调用 MDB。

这个问题的原因是我看到有时在数据库异常期间消息被重新传递到 MDB。尽管 MDB 被定义为不参与任何容器管理的事务,但 db 问题与数据库事务相关,这会导致消息重新传递到 MDB。

如果我的问题不清楚,请告诉我。

@TransactionManagement(TransactionManagementType.BEAN)
@MessageDriven(name = "NonPersistentInquiryMessageBean", activationConfig = {      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")    })
public class InvoiceInquiryMessageBean implements MessageListener
{
      @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
      public void onMessage(Message msg)
      {
          call a CMT Bean(CMT_DB_Bean) which performs database operations
      }
}

CMT  Bean

@Stateless
public class InvoiceManager implements InvoiceManager Local {
entityManager.update();

}  
4

1 回答 1

1

这个问题的原因是我看到有时在数据库异常期间消息被重新传递到 MDB。

我认为您的问题与异常处理有关,与事务分界无关。MDB 和会话 bean 在不同事务中执行的事实并不意味着它们与异常传播隔离。

当您的会话 bean 引发异常时,它会传播到客户端(在本例中为 InvoiceInquiryMessageBean)。如果您的 MDB 不处理它,容器将不会确认该消息,因此,它将被重新传递。

一种可能的解决方案是处理 MDB 中的异常。

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
  public void onMessage(Message msg)
  {
try { 
      call a CMT Bean(CMT_DB_Bean) which performs database operations
} catch (Exception e) {
 //log  
}
  }
于 2014-05-07T12:42:13.050 回答