gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:34:59 26 4
gpt4 key购买 nike

我想在从队列接收消息的 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/

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