我需要两个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,但是我不确定这是否是解决方案。
您在使用吗
com.atomikos.remoting.spring.rest.TransactionAwareRestContainerFilter
com.atomikos.remoting.spring.rest.TransactionAwareRestClientInterceptor
课程?
TransactionAwareRestClientFilter
在jaxrs软件包中。