完成以下任务的最佳方法是什么?
@MessageDriven bean在数据库上做了一些工作
如果失败,我想回滚数据库事务
但我也希望不要重新发送JMS消息,即不要重试。
我可以想到一些可行的方法。还有其他的,哪个是最好的?
使用@TransactionManagement(type=BEAN)
和UserTransaction
,并在捕获异常后显式回滚。例如。:catch (Exception e) { e.printStackTrace(); utx.rollback();}
使用容器管理的事务,在@TransactionAttribute(value=NOT_SUPPORTED)
上指定onMessage
,然后使用@TransactionAttribute(value=REQUIRED)
将数据库活动委派给单独的方法。
保留事务处理,然后在服务器中重新配置重试属性。我正在使用Glassfish 3.1.1,但我不确定如何设置它。
保留所有内容,并明确检查邮件是否在onMessage
正文中重新发送,如果重新发送,则退出。 (message.getJMSRedelivered()
?)
有什么运作良好的地方?有没有解决此问题的标准/最佳实践方法?
最佳答案
最简单,最可移植的方法是在声明时在@TransactionAttribute(value=NOT_SUPPORTED)
上使用onMessage()
,然后使用@TransactionAttribute(REQUIRES_NEW)
将数据库工作移至另一个bean
请谨慎使用单独的方法,因为这将不起作用。在JMS MDB中,onMessage()
方法是唯一可以使用@TransactionAttribute
的方法。