閱讀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-阿裏雲