接入单元化能力
本文将引导您对本地分布式事务客户端进行改造,接入单元化能力。
说明
该功能仅适用于支持 LDC 单元化架构的环境。
DTX 服务配置
添加 Maven 依赖:
<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>dtx-enterprise-sofa-boot-starter</artifactId> <version>${dtx.version}</version> </dependency>
服务配置:
<bean id="dtxService" class="com.alipay.dtx.client.core.api.impl.DtxServiceImpl"/>
发起方配置
发起方应用配置 spring 事务模板,配置示例如下:
<!--声明新的事务模板-->
<bean id="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
<property name="propagationBehaviorName">
<value>PROPAGATION_REQUIRES_NEW</value>
</property>
</bean>
在发起方的 spring 事务模板内,调用 dtxService.start(bizType, bizId, userId, context)
方法开启分布式事务(不再使用前文中 [@DtxTransaction](#)
注解的方式开启事务);其中参数 userId
会作为单元化架构下的路由参数,用作服务路由和数据库路由。
public class YourClass {
public void yourMethod(yourParams) {
transactionTemplate.execute(newTransactionCallback() {
@Override
public Object doInTransaction (TransactionStatus status){
//开启分布式事务
dtxService.start(bizType, bizId, userId, context)
try {
// 调用 TCC1 参与者一阶段try方法, 第一个参数是用户ID,try方法BusinessActionContext参数值传'null';
TCC1. try (userId,params1,null) ;
// 调用 TCC2 参与者一阶段try方法,第一个参数是用户ID,try方法BusinessActionContext参数值传'null';
TCC2. try (userId,params2,null) ;
// 方法正常返回,事务提交
} catch (Throwable t) {
// 出现异常,事务回滚
throw t;
}
}
});
}
}
发起方实现回查服务
当事务状态不确定时,dtxserver 需要通过回查服务询问发起方分布式事务状态,发起方需要实现 com.alipay.dtx.client.core.api.ActivityStateResolver
接口,在 isDone
方法中返回事务的状态(0 即未知,1 即提交,2 即回滚);
public class ActivityStateResolverImpl implements com.alipay.dtx.client.core.api.ActivityStateResolver {
@Override
public int isDone(String businessType, String businessId) {
System.out.println("回查, businessType:" + businessType + ", businessId" + businessId);
return ActivityStateResolver.NOT_DONE | ActivityStateResolver.DONE;
}
}
回查服务配置成 spring bean:
<bean id="activityStateResolver" class="com.xxx.ActivityStateResolverImpl"/>