spring - 如何在 Spring Programmatic 事务中获取 transactionManager 引用

标签 spring transactions jms

我想在从队列接收消息的 JMS 应用程序中使用 spring 编程事务。同时,我想将队列包含在事务范围内。

使用 Spring DefaultMessageListnereContainer 并在其中注入(inject)事务管理器。但是,不确定如何获得此事务的引用以以编程方式提交或回滚?

我在这里阅读并理解“在事务中处理消息”
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jms.html#jms-tx-participation

我的两个要求是 -
1) XA 事务因此注入(inject) JtaTransactionManager,
2) 使用编程事务 - 在这里我需要帮助如何在代码中获取对 spring 启动的事务的引用,以便我可以以编程方式处理事务

最佳答案

您首先必须注入(inject) org.springframework.transaction.PlatformTransactionManager - 它和其他所有的 bean 一样是普通的 bean :

@Resource
private PlatformTransactionManager transactionManager;

现在可以和TransactionTemplate一起使用了:
final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallback<String>() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
        transactionManager.rollback(status);
        return ":-(";
    }
});

相当多的代码,所以这里是你应该如何做到这一点:
@Transactional
public void onMessage(Message message) {
    //rollback:
    throw new HoustonException("We've got a problem!");
}

如果你抛出 RuntimeException来自 @Transactional方法,它将自动回滚该事务。否则它将被提交。

请注意,这并不意味着 JMS 和数据库正在处理同一个事务!当您抛出异常时,JMS 代理将尝试重新传递消息,但是在提交数据库事务后代理可能会失败。如果您需要 100% 确定 JMS 和 DB 更新都是原子的,那么您需要分布式事务管理器。

关于spring - 如何在 Spring Programmatic 事务中获取 transactionManager 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9034101/

相关文章:

java - 动态创建多个CronTriggerBean bean

java - Spring + Hibernate + Maven org.hibernate.MappingException : AnnotationConfiguration instance is required

database - 两阶段提交是否可以防止最终提交失败?

oracle - ORA-06519 的根本原因

NHibernate ITransaction 和纯域模型

java - Python JMS Stomp 客户端和 Apache ActiveMQ - 监听器不起作用

java - JMS 消息对象可以有多大?

java - 如何使用 Spring Security 保护我的 Spring Data Rest 端点?

Spring Security 何时使用 WebSecurityConfigurerAdapter 和 UserDetailsS​​ervice

java - 从 Tomcat 使用 WebLogic (t3) JMS