Skip to content

Commit

Permalink
add user guide.md
Browse files Browse the repository at this point in the history
  • Loading branch information
changming.xie committed Apr 21, 2016
1 parent 5fe11c3 commit 40737f0
Showing 1 changed file with 80 additions and 0 deletions.
80 changes: 80 additions & 0 deletions userguide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@

配置tcc-transaction

在项目中需要引用tcc-transaction-spring jar包,如使用maven依赖:
<dependency>
<groupId>org.mengyun</groupId>
<artifactId>tcc-transaction-spring</artifactId>
<version>${project.version}</version>
</dependency>

另外,启动应用时,需要将tcc-transaction-spring jar中的tcc-transaction.xml加入到classpath中。如在web.xml中配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:tcc-transaction.xml
</param-value>
</context-param>

如何发布Tcc服务

发布一个Tcc服务方法,可被远程调用并参与到Tcc事务中,发布Tcc服务方法有下面四个约束:
1. 在服务方法上加上@Compensable注解
2. 服务方法第一个入参类型为org.mengyun.tcctransaction.api.TransactionContext
3. 服务方法的入参都须能序列化(实现Serializable接口)
4. try方法、confirm方法和cancel方法入参类型须一样

tcc-transaction将拦截加上了@Compensable注解的服务方法,并根据Compensalbe的confirmMethod和cancelMethod获取在CONFRIM阶段和CANCEL阶段需要调用的方法。
tcc-transaction在调用confirmMethod或是cancelMethod时是根据发布Tcc服务的接口类在Spring的ApplicationContext中获取Tcc服务实例,并调用confirmMethod或cancelMethod指定方法。
因此如果是使用动态代理的方式实现aop(默认方式),则confirmMethod和cancelMethod需在接口类中声明,如果使用动态字节码技术实现aop(如指定aspectj-autoproxy的proxy-target-class属性为true),则无需在接口类中声明。

服务方法第一个org.mengyun.tcctransaction.api.TransactionContext类型的入参为预留入参,tcc-transaction使用此参数将在远程调用时传递TCC事务上下文信息。
tcc-transaction在执行服务过程中会将Tcc服务的上下文持久化,包括所有入参,内部实现为将入参使用jdk自带的序列化机制序列化为为byte流,所以需要实现Serializable接口。

在tcc-transaction-dubbo-capital中发布Tcc服务示例:

try方法:
@Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord")
public void record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {

confirm方法:
public void confirmRecord(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {

cancel方法:
public void cancelRecord(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {

在tcc-transaction-dubbo-redpacket中发布Tcc服务示例:

try方法:
@Compensable(confirmMethod = "confirmRecord",cancelMethod = "cancelRecord")
public void record(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) {

confirm方法:
public void confirmRecord(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) {

cancel方法:
public void cancelRecord(TransactionContext transactionContext, RedPacketTradeOrderDto tradeOrderDto) {

如何调用远程Tcc服务
调用远程Tcc服务,将远程Tcc服务参与到本地Tcc事务中,本地的服务方法也需要声明为Tcc服务,与发布一个Tcc服务不同,本地Tcc服务方法有三个约束:
1. 在服务方法上加上@Compensable注解
2. 服务方法的入参都须能序列化(实现Serializable接口)
3. try方法、confirm方法和cancel方法入参类型须一样

即与发布Tcc服务不同的是本地Tcc服务无需声明服务方法第一个入参类型为org.mengyun.tcctransaction.api.TransactionContext。

在tcc-transaction-dubbo-order中调用远程Tcc服务示例:

try方法:
@Compensable(confirmMethod = "confirmMakePayment",cancelMethod = "cancelMakePayment")
public void makePayment(Order order, BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) {

confirm方法:
public void confirmMakePayment(Order order, BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) {

cancel方法:
public void cancelMakePayment(Order order, BigDecimal redPacketPayAmount, BigDecimal capitalPayAmount) {





0 comments on commit 40737f0

Please sign in to comment.