@MessageDriven事务和重新传递语义

wrs*_*der 8 jms glassfish message-driven-bean ejb-3.1 glassfish-3

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

  • @MessageDriven bean在数据库上做了一些工作
  • 失败时,我想回滚数据库事务
  • 但是我也希望JMS消息不被重新传递,即不要重新尝试.

我能想到的几个方法可能会工作.还有其他什么,哪个最好?

  • 使用@TransactionManagement(type=BEAN)UserTransaction,并在捕获异常后显式回滚.例如:

    catch (Exception e) { e.printStackTrace(); utx.rollback(); }

  • 使用容器管理的事务,指定@TransactionAttribute(value=NOT_SUPPORTED)onMessage然后委托DB活动与一个单独的方法@TransactionAttribute(value=REQUIRED).

  • 保留事务处理,并在服务器中重新配置重试属性.我正在使用Glassfish 3.1.1,我不确定如何设置它.

  • 保留所有内容并明确检查消息是否在正文中重新发送,onMessage如果重新发送则退出.(message.getJMSRedelivered()?)

什么运作良好?有没有一种标准/最佳实践方法来处理这个问题?

Dav*_*ins 8

最简单,最便携的方法是@TransactionAttribute(value=NOT_SUPPORTED)onMessage()您声明并将数据库工作移动到另一个bean时使用@TransactionAttribute(REQUIRES_NEW)

请注意单独的方法方法,因为这不起作用.在JMS MDB中,该onMessage()方法是@TransactionAttribute可以使用的唯一方法.