Java 如何在MDB中停止回滚?
我有一个onMessage方法,从队列接收ObjectMessage,并使用该信息填充和持久化JPA实体对象。但是,当持久化实体对象时出现问题时,它将重新执行onMessage()。我的猜测是,它将ObjectMessage推回到队列中,因此onmessage将再次执行。这样我就进入了一个无限循环。如何停止onMessage()以再次执行或控制其执行次数。这是我的密码。 saveAuditData(auditInfo)发生错误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连接中的任何故障
当容器启动容器管理的事务以处理JMS消息时,JDBC连接中的任何故障或线程中抛出的异常都将导致全局XA事务回滚。因此,消息返回到队列,稍后将根据队列配置重试:重试间隔时间,将消息移动到死信队列之前的最大重试次数 因此,您有以下选项:
- 在MDB部署描述符中选择“Bean托管”事务模式,并使用UserTransaction from lookup to
手动调用java:comp/UserTransaction
、begin
或commit
,因此请注意异常处理rollback
- 保持“Container managed”事务,但查询JMS消息上的redelivery count属性以决定下一步的操作:重试可能失败的操作,或者跳过此步骤并将数据保存到数据库中。您可以从
或message.getJMSRedelivered()
获取邮件的重新交付信息,前提是您的JMS提供商提供了该信息message.getLongProperty(“JMSXDeliveryCount”)
- 或者,将您的
方法移动到部署描述符中具有事务支持saveAuditData
的EJB无状态bean,以便创建一个新事务,并且无论MDB事务发生什么情况,都会保存您的数据。此选项可以与上一个选项组合使用RequiresNew
@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) {
.....
}