完成以下任务的最佳方法是什么?


@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的方法。

08-17 15:27