gpt4 book ai didi

java - EJB 事务回滚后自动重试

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:21 27 4
gpt4 key购买 nike

基本上,我有一个 JMS 队列和一个 MDB,用于从 JMS 队列收集消息,对它们进行一些处理,然后通过 JPA 将消息保存到数据库中。我将负责将消息保存到数据库中的方法标记为在新事务中启动:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void create(T entity)
{
try
{
getEntityManager().persist(entity);
}
catch(Exception e)
{
throw new RuntimeException("DB Exception");
}
}

如果事务被回滚,它是否会自动退役直到事务完成?如果没有,如何启用它?

最佳答案

如果异常传播到 MDB,事务将不会提交,消息将不会被确认为已接收并将重试。来自 EJB 3.1 规范:

Message acknowledgment is automatically handled by the container. If the message-driven bean uses container-managed transaction demarcation, message acknowledgment is handled automatically as a part of the transaction commit.

我对 Weblogic 不熟悉,但应该有一个 JMS 队列参数,用于设置重试次数、重试间隔等,直到消息被丢弃或放入未传递的队列中。

但通常最好在 MDB 中捕获异常,因为从 MDB 抛出的 RuntimeException 会导致 bean 被容器。来自 EJB 3.1 规范:

Message-driven beans should not, in general, throw RuntimeExceptions.

A RuntimeException that is not an application exception thrown from any method of the message-driven bean class (including a message listener method and the callbacks invoked by the container) results in the transition to the “does not exist” state.

例如,最好有:

public class MyMDB implements MessageListener {

@Resource
private MessageDrivenContext context;

public void onMessage() {
try {
//some other processing
someService.create(entity);
}
catch(Exception e) {
//mark the message as undelivered
context.setRollbackOnly();
}
}
}

关于java - EJB 事务回滚后自动重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16176375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com