阅读109 返回首页    go iPhone_iPad_Mac_手机_平板_苹果apple


TXC for MQ 样例工程__TXC for MQ_消息队列 MQ-阿里云

样例工程下载地址:TXC Sample下载

样例工程内容说明:

将压缩包解开,包括4个 Maven 工程。

  • sample-txc-simple:最简的 TXC 样例工程,该工程给出了一个最少依赖的 TXC 案例,TXC 使用入门必看。
  • sample-txc-mq:最简 TXC 样例的基础上增加了 MQ 的使用,将 MQ 也包含进了分布式事务,保证了数据库操作与消息发送的分布式事务,数据库操作提交,则消息一定发送成功;数据库操作回滚,则消息一定不会被发送出去。本案例是 TXC 和 MQ 综合实践的入门案例。
  • sample-txc-edas:在 EDAS 上使用 TXC 的案例,该案例综合了 TXC、EDAS 及 MQ 的使用,通过 Console 和 Web 两种方式充分展现了用户的使用场景,是 EDAS 上部署 TXC 的进阶案例,该案例可以让用户对 TXC 使用场景有更全面的理解。
  • sample-mq-consumer:该工程主要为上述案例中的 MQ 消息 provider 提供一个 Consumer 案例,该工程不依赖 TXC,仅为方便用户理解 MQ 案例。

sample-txc-simple 样例工程

业务逻辑说明

本案例的业务逻辑是 A 转账给 B 了10次,前五次成功,后五次失败,其中 A 和 B 分别位于两个 MySQL 数据库中,使用 TXC 事务保证了 A 和 B 钱的总数始终不变。

案例搭建方法

(1) 从 MQ 控制台申请事务分组。

(2) 需要两台 RDS,一台 ECS 用于部署本应用。

(3) 在两个 RDS 实例中分别执行 txc_sample1.sql 和 txc_sample2.sql 完成建表。

(4) 把该工程拷贝到 ECS 服务器上,找到 sample-txc-simple/src/main/resources 目录下的 txc-client-context.xml 文件,对该文件中的两个数据源进行修改,分别替换为两个 RDS 的数据源。再将该文件中的xxxxx替换为在(1)中申请的 TXC 组 ID。

(5) 将 accessKey 和 secretKey 替换成本用户自己的 AK/SK。 AccessKey 为阿里云账户的 AK,SecretKey 为阿里云账户的 SK,可以在阿里云用户中心查询。

(6) 在 sample-txc-simple 目录下执行 build.sh 编译本工程。编译完成后在 sample-txc-simple/client/bin 目录下执行 run.sh 可以看到运行结果。

(7) java源代码在 /sample-txc-simple/src/main/java/com/taobao/txc/tests 目录下,可以根据业务需求修改。

sample-txc-mq 样例工程

业务逻辑说明

本案例和 sample-txc-simple 案例类似,业务逻辑是 A 转账给 B 了10次,前五次成功,后五次失败。和 sample-txc-simple 案例不同的是,在 A 转账给B成功后,增加了 MQ 的一个通知,告知转账成功。使用 TXC 事务保证了 A 和 B 钱的总数始终不变,同时保证了只有转账成功的情况下 MQ 通知才可见。

案例搭建方法

(1) 从 MQ 控制台申请事务分组,并申请一个MQ topic。

(2) 需要两台 RDS,一台 ECS 用于部署本应用。

(3) 在两个 RDS 实例中分别执行 txc_sample1.sql 和 txc_sample2.sql 完成建表。

(4) 把该工程拷贝到 ECS 服务器上,找到 sample-txc-mq/src/main/resources 目录下的 txc-mq-client-context.xml 文件,对该文件中的两个数据源进行修改,分别替换为两个RDS的数据源。再将该文件中的xxxxx替换为在(1)中申请的 TXC 组 ID。再将自己申请的 MQ 相关信息配置到该文件中,即将 下的 MQ 配置替换为自己的 MQ 配置。 并且将 accessKey 和 secretKey 替换成本用户自己的 AK/SK。 AccessKey 为阿里云账户的 AK,SecretKey 为阿里云账户的 SK,可以在阿里云用户中心查询。

(5) 在 sample-txc-mq 目录下执行 build.sh 编译本工程。编译完成后在 sample-txc-mq/client/bin 目录下执行 run.sh 可以看到 MQ 的 provider 运行结果。

(6) 将 sample-mq-consumer 工程拷贝到 ECS 服务器中,在 sample-mq-consumer/src/main/java/com/taobao/txc/tests 中找到 SMSListener.java,修改其中 MQ 配置为申请的 MQ 配置。在 sample-mq-consumer 目录下执行 build.sh 编译该工程,编译完成后在 sample-mq-consumer/client/bin 目录下执行 run.sh 可以 Consumer 掉刚刚 sample-txc-mq 工程生产出来的 MQ 消息。

(7) sample-txc-mq 工程的 Java 源代码在 /sample-txc-mq/src/main/java/com/taobao/txc/tests 目录下,可以根据业务需求修改。

TXC+MQ 使用说明

(1) 在部署 MQ 下的 TXC 应用时,需要在代码中配置 MQ 资源,包括 Producer ID、Consumer ID 和 AccessKey,如下图所示。如果您还没有 MQ 资源,需要申请一个 MQ 资源,MQ 资源申请参考MQ Quick Start

(2) MQ 的 Producer 工程的配置与使用。

首先,需要在配置文档 xml 中配置好 MQ 资源,例如:

  1. <bean class="com.taobao.txc.client.aop.MTRelationShipManager">
  2. <property name="beanNames" ref="mtServicesClassList" />
  3. <property name="interceptorNames">
  4. <list>
  5. <value>mtBranchInterceptor</value>
  6. </list>
  7. </property>
  8. <property name="order" value="1"></property>
  9. <property name="proxyTargetClass" value="false"></property>
  10. </bean>
  11. <bean id="mtBranchInterceptor" class="com.taobao.txc.resourcemanager.mt.MtBranchInterceptor"/>
  12. <bean id="mtServicesClassList" class="org.springframework.beans.factory.config.ListFactoryBean">
  13. <property name="sourceList">
  14. <list>
  15. <value>com.taobao.txc.rm.mq.TxcMQProducer</value>
  16. </list>
  17. </property>
  18. </bean>
  19. <bean id="txc_mq_producer" class="com.taobao.txc.rm.mq.TxcMQProducerImpl">
  20. <constructor-arg name="ProducerId" value="PID_txc_mq_prod_test"/>
  21. <constructor-arg name="AccessKey" value="XXX"/>
  22. <constructor-arg name="SecretKey" value="XXX"/>
  23. </bean>

然后,需要在代码中启动一个 MQ 资源,例如:

  1. TxcMQProducer txcMQProducer = (TxcMQProducer) context.getBean("txc_mq_producer");
  2. txcMQProducer.start();
  3. System.out.println("Producer started!");

最后,要实现 MQ 事务,需要在 TXC 注解函数范围内发用一个 MQ 消息,例如:

  1. @TxcTransaction(appName = "myapp")
  2. public void update(Connection connection1, Connection connection2) throws SQLException, MQClientException {
  3. //数据源操作
  4. update1(connection1);
  5. update2(connection2);
  6. //创建一个消息
  7. Message msg = new Message(/*topic*/"txc_mq_test",
  8. /*tag*/"onePay",
  9. String.format("onePay message:successn").getBytes());
  10. /* 发送一个消息,事务完成消息可见 */
  11. SendResult sendResult = txcMQProducer.send(null, 0, msg);
  12. }

(3) MQ 的 Consumer 工程的配置与使用可以参考下面这个例子实现:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID_txc_mq_prod_test");
  3. properties.put(PropertyKeyConst.AccessKey, "XXX");
  4. properties.put(PropertyKeyConst.SecretKey, "XXX");
  5. Consumer consumer = ONSFactory.createConsumer(properties);
  6. consumer.subscribe("txc_mq_test", "*", new MessageListener() {
  7. @Override
  8. public Action consume(Message message, ConsumeContext context) {
  9. log.info(String.format("SMSListener got message:%s", message));
  10. System.out.println(String.format("SMSListener got message:%s", message));
  11. System.out.println(new String(message.getBody()));
  12. return Action.CommitMessage;
  13. }
  14. });
  15. consumer.start();

sample-txc-edas 样例工程

业务逻辑说明

从 DecMoney 扣款,给 IncMoney 打款,IncMoney 打款服务中会根据 IncMoney 目前余额更新用户相应的 Level。业务为了模拟应用异常产生,故意先给 IncMoney 打款,然后从 DecMoney 扣款后检查 DecMoney 余额,如果为负值则抛出应用异常导致全局事务回滚。该业务的展现方式有两种,分别是 Web 方式、Console 方式。此外,还有提供了一种带有 MQ 操作的 Console方式客户端。

样例工程内容说明

本样例主要包含以下几个子工程:

  • txc-client-web: EDAS+TXC 的 MVC 客户端 Spring mvc,用 Web 方式展现业务逻辑。
  • txc-client-console: EDAS+TXC 的 Console 客户端,用 Console 的方式展现业务逻辑。
  • txc-client-mq: EDAS+TXC+MQ 的 Console 客户端,用 Console 的方式展现综合了 EDAS 和 MQ 的业务逻辑。
  • txc-edas-api: DecMoney、 IncMoney 、UpdateStarLevel 服务接口定义。
  • txc-level-service: UpdateStarLevel的 EDAS 服务端实现 war 应用。
  • txc-money-service: IncMoney,DecMoney 的 EDAS 服务端实现 war 应用。

案例搭建方法

(1) 从 TXC 控制台申请事务分组,并申请一个 MQ 服务。

(2) 从 EDAS 控制台申请 EDAS 应用分组。

(3) 需要三台 ECS 用于部署 EDAS 服务。详情请参见 EDAS Quick Start。需要按照 EDAS 要求安装 EDAS Agent 服务。

说明:

因为样例程序包含 DRDS 以及 RDS 的两个测试用例,所以客户可以根据需要申请 DRDS 或 RDS 服务。

使用 EDAS+DRDS 用例,需要建表:txc_sample_edas_drds.sql

使用 EDAS+RDS 用例,需要建表:txc_undo_log.sql、txc_sample_edas_rds.sql

(4) 对工程中所有的 RDS 和 DRDS 数据源、MQ 配置、TXC 组配置等进行相应修改。主要涉及的文件如下:

  • sample-txc-edas/txc-money-service/src/main/resources/txc-datasource.xml
  • sample-txc-edas/txc-level-service/src/main/resources/txc-datasource.xml
  • sample-txc-edas/txc-client-web/src/main/resources/txc-2-client-drds.xml
  • sample-txc-edas/txc-client-mq/src/main/resources/txc-2-client-rds.xml
  • sample-txc-edas/txc-client-console/src/main/resources/txc-2-client-rds.xml

(5) 在 sample-txc-edas 目录下执行 build.sh 完成工程编译。通过 EDAS 控制台上传并启动下面三个 war。

  • sample-txc-edas/txc-level-service/target/txc-level-service.war
  • sample-txc-edas/txc-money-service/target/txc-money-service.war
  • sample-txc-edas/txc-client-web/target/txc-client-web.war

(6) 使用 Web Service 方式验证部署结果。

  • 访问 txc-client-web 客户端应用的地址:https://ip:8080/txc-client-web/client
  • 首先显示的是 inc_money,dec_money,level 三个表的当前值。
  • 通过 reset 可以重置 dec_money 的初始值并清空 inc_money 和 level 表的值。
  • 输入每次转款的金额数测试成功的全局事务和余额不足产生异常并回滚的全局事务。配动图

(7) 使用 txc-client-console 子工程的 Console 方式验证服务部署结果。

  • 将 sample-txc-edas 整个工程拷贝到 ECS 服务器上,按步骤(4)修改参数配置,然后在 sample-txc-edas 目录下执行 build.sh 完成工程编译。
  • 设置运行时环境变量,将下面的xxxx替换为自己的配置,可以咨询 EDAS 管理人员。

配代码如下

  1. export JAVA_OPTS="-Dproject.name=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -Dtenant.id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -Dspas.identity=/home/admin/.spas_key/default -Daddress.server.domain=xxxx -Daddress.server.port=xxxx -Dconfigserver.client.port=xxxx -DJM.LOG.RETAIN.COUNT=7 -DJM.LOG.FILE.SIZE=300MB"

在 sample-txc-edas/txc-client-console/client/bin 目录下执行 run.sh,可以看到执行结果。

(8) 使用txc-client-mq 子工程的 Console 方式验证综合了 MQ 业务的服务部署结果。

  • 将 sample-txc-edas 整个工程拷贝到 ECS 服务器上,按步骤(4)修改参数配置,然后在 sample-txc-edas 目录下执行 build.sh 完成工程编译。
  • 设置运行时环境变量,将下面的xxxx替换为自己的配置,可以咨询 EDAS 管理人员询问。配代码如下:

    1. export JAVA_OPTS="-Dproject.name=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -Dtenant.id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -Dspas.identity=/home/admin/.spas_key/default -Daddress.server.domain=xxxx -Daddress.server.port=xxxx -Dconfigserver.client.port=xxxx -DJM.LOG.RETAIN.COUNT=7 -DJM.LOG.FILE.SIZE=300MB"

在 sample-txc-edas/txc-client-mq/client/bin 目录下执行 run.sh,可以看到 MQ 的 provider 执行结果。

将 sample-mq-consumer 工程拷贝到 ECS 服务器中,在 sample-mq-consumer/src/main/java/com/taobao/txc/tests 中找到 SMSListener.java,修改其中的xxxxx为申请的 MQ 配置。在 sample-mq-consumer 目录下执行 build.sh 编译该工程,编译完成后在 sample-mq-consumer/client/bin 目录下执行 run.sh 可以 Consumer 掉刚刚 sample-txc-edas/txc-client-mq 工程生产出来的 MQ 消息。

最后更新:2016-11-23 18:56:48

  上一篇:go TXC for MQ 快速入门__TXC for MQ_消息队列 MQ-阿里云
  下一篇:go TXC SDK for MQ__TXC for MQ_消息队列 MQ-阿里云