Java 如何在MDB中停止回滚?

Java 如何在MDB中停止回滚?,java,exception-handling,transactions,rollback,message-driven-bean,Java,Exception Handling,Transactions,Rollback,Message Driven Bean,我有一个onMessage方法,从队列接收ObjectMessage,并使用该信息填充和持久化JPA实体对象。但是,当持久化实体对象时出现问题时,它将重新执行onMessage()。我的猜测是,它将ObjectMessage推回到队列中,因此onmessage将再次执行。这样我就进入了一个无限循环。如何停止onMessage()以再次执行或控制其执行次数。这是我的密码。 saveAuditData(auditInfo)发生错误 当容器启动容器管理的事务以处理JMS消息时,JDBC连接中的任何故障

我有一个onMessage方法,从队列接收ObjectMessage,并使用该信息填充和持久化JPA实体对象。但是,当持久化实体对象时出现问题时,它将重新执行onMessage()。我的猜测是,它将ObjectMessage推回到队列中,因此onmessage将再次执行。这样我就进入了一个无限循环。如何停止onMessage()以再次执行或控制其执行次数。这是我的密码。 saveAuditData(auditInfo)发生错误


当容器启动容器管理的事务以处理JMS消息时,JDBC连接中的任何故障或线程中抛出的异常都将导致全局XA事务回滚。因此,消息返回到队列,稍后将根据队列配置重试:重试间隔时间,将消息移动到死信队列之前的最大重试次数

因此,您有以下选项:

  • 在MDB部署描述符中选择“Bean托管”事务模式,并使用UserTransaction from lookup to
    java:comp/UserTransaction
    手动调用
    begin
    commit
    rollback
    ,因此请注意异常处理

  • 保持“Container managed”事务,但查询JMS消息上的redelivery count属性以决定下一步的操作:重试可能失败的操作,或者跳过此步骤并将数据保存到数据库中。您可以从
    message.getJMSRedelivered()
    message.getLongProperty(“JMSXDeliveryCount”)
    获取邮件的重新交付信息,前提是您的JMS提供商提供了该信息

  • 或者,将您的
    saveAuditData
    方法移动到部署描述符中具有事务支持
    RequiresNew
    的EJB无状态bean,以便创建一个新事务,并且无论MDB事务发生什么情况,都会保存您的数据。此选项可以与上一个选项组合使用


您可以简单地用TransactionType注释标记onMessage方法:

@TransactionAttribute(value=TransactionAttributeType.REQUIRES_NEW)
public void onMessage(Message message) {
     .....
}

嗨,阿卡索拉。我在尝试您所说的内容时得到了这条消息:此行有多个标记-implements javax.jms.MessageListener.onMessage-JSR 345:EJB 3.2,8.37:REQUIRES_NEW transaction属性类型值对于消息驱动的bean消息侦听器方法无效。指定所需或不支持的值。我认为这是行不通的。
@TransactionAttribute(value=TransactionAttributeType.REQUIRES_NEW)
public void onMessage(Message message) {
     .....
}