我有一个 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();
}