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

Nit*_*aur 4 spring transactions jms

我想在JMS应用程序中使用spring programmatic事务来接收来自队列的消息.同时,我想将队列包含在事务范围中.

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


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

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

Tom*_*icz 11

你首先必须注入org.springframework.transaction.PlatformTransactionManager- 它是一个像所有其他人一样普通的bean:

@Resource
private PlatformTransactionManager transactionManager;
Run Code Online (Sandbox Code Playgroud)

现在您可以将它与TransactionTemplate:

final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallback<String>() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
        transactionManager.rollback(status);
        return ":-(";
    }
});
Run Code Online (Sandbox Code Playgroud)

相当多的代码,所以这是你应该如何做到这一点:

@Transactional
public void onMessage(Message message) {
    //rollback:
    throw new HoustonException("We've got a problem!");
}
Run Code Online (Sandbox Code Playgroud)

如果抛出一个RuntimeExceptionfrom @Transactional方法,它将自动回滚该事务.否则它将被提交.

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