使用Atomikos事务管理器通过Spring Boot实现的跨远程REST服务的分布式事务

问题描述 投票:0回答:1

我需要两个REST服务属于单个事务(分布式事务)的一部分,因此,例如,如果客户端调用成功的SERVICE_1,然后调用不成功的SERVICE_2,则SERVICE_2 AND SERVICE_1必须执行回滚。

我通过Atomikos事务管理器(TransactionEssentials),使用Apache CXF实现的服务以及使用JAX-RS调用REST服务的Java客户端(事务编排器)成功实现了这一目标。我的工作基于Atomikos提供的出色示例,可以在这里找到:https://www.atomikos.com/downloads/extreme-transactions/com/atomikos/examples/5.0.6/examples-5.0.6-project.zip(examples-jta-rest-jaxrs)。

我面临的问题是,当我用Spring Boot替换REST服务实现时,全局事务不再起作用。我将问题缩小到Spring Boot REST服务,该服务在调用者(开始并提交全局事务)所需的标头中不返回'Atomikos-Extent'属性。这是调用者抛出的异常:

WARNING: Invalid extent found - any remote work will time out and rollback.
java.lang.IllegalArgumentException: Expected an extent but found none. The remote work will not be committed by us.
      at com.atomikos.remoting.DefaultExportingTransactionManager.addExtent(DefaultExportingTransactionManager.java:70)

所以,问题是,如何实现Spring Boot REST服务,以便它可以通过Atomikos事务管理器参与全局事务。

下面是一些可能很重要的代码段。

客户/呼叫者

Client client1= newClient().register(JacksonJsonProvider.class)
        .register(ParticipantsProvider.class)
        .register(TransactionAwareRestClientFilter.class);
Client client2 = //same as client1
UserTransactionManager utm = new UserTransactionManager();
utm.init();
utm.begin();
callService1();
callService2();
utm.commit();
utm.close();

服务

@EnableTransactionManagement
@SpringBootApplication
public class SpringBootAtomikosExampleApplication {
    //..    
    @Bean(initMethod="init", destroyMethod="close")
    public AtomikosDataSourceBean dataSource() {
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();   
        //..
        return ds;
    }
}

@Transactional
@RestController
public class MyController {

    @RequestMapping("/test")
    public void test() throws Exception {   
        TransactionManager tm = new UserTransactionManager();
        tm.begin();
        try (Connection con = dataSource.getConnection();
            Statement s = con.createStatement();) {
            s.executeQuery("select count(*) from menu");
        }
        tm.commit();
    }
}

我发现含糊的信息是,在春季启动时,您应该使用Atomikos ExtremeTransaction而不是TransactionEssentials,但是我不确定这是否是解决方案。

rest spring-boot jta distributed-transactions atomikos
1个回答
0
投票

您在使用吗

  • com.atomikos.remoting.spring.rest.TransactionAwareRestContainerFilter
  • com.atomikos.remoting.spring.rest.TransactionAwareRestClientInterceptor

课程?

TransactionAwareRestClientFilter在jaxrs软件包中。

© www.soinside.com 2019 - 2024. All rights reserved.