MQ総務導入しました
MQトランザクション・メッセージ・フロー
- SEND_OK:プロデューサーのMQ、メッセージの状態にメッセージを送信します。このメッセージは、消費者には見えません(消費者がこのエントリのメッセージを消費することはできません)
- 地元のタスクを実行:成功、返すCOMMIT_MESSAGEを、今回の消費者はメッセージにこのエントリを消費することができます。エントリーMQ削除メッセージのこの時点で、ROLLBACK_MESSAGEを返すために失敗しました。
- メッセージは(COMMIT_MESSAGE)が削除されていない一定の時間(ROLLBACK_MESSAGE)の後に確認されない場合は、コールバックメソッド、ローカル・トランザクションが成功したかどうかを確認アクティブにMQ、イニシアチブは、確認メッセージのステータスが必要です。
1、設定ファイル
詳細については、以下を参照してください。https://www.cnblogs.com/happydreamzjl/p/12022412.html
2、プロデューサー
図1に示すように、構成プロデューサ
パッケージ com.gofun.customer.mqTrans; 輸入 com.gofun.customer.mq.RocketMqProducerProperties。 輸入 org.apache.rocketmq.client.exception.MQClientException。 輸入 org.apache.rocketmq.client.producer.TransactionMQProducer; 輸入 org.springframework.beans.factory.annotation.Autowired; 輸入 org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 輸入 org.springframework.boot.context.properties.EnableConfigurationProperties。 輸入 org.springframework.context.annotation.Bean; 輸入 org.springframework.context.annotation.Configuration。 輸入 java.util.concurrentの*。; @Configuration @EnableConfigurationProperties(RocketMqProducerProperties。クラス) @ConditionalOnProperty(接頭辞= " rocketmq.producer "、NAME = " iseffect "、havingValue = " 真 ") パブリック クラス RocketMqTransConfig { @Autowired プライベート RocketMqProducerProperties rocketMqProperties。 民間 最終 INT corePoolSize = 2; //スレッドの最小数消費 プライベート 最終 INT maximumPoolSize = 5と、スレッドの//消費者の最大数 プライベート 最終 ロング keepAliveTimeが= 100; //は、アクティブ時間スレッド プライベート 最終 TimeUnitでTIMEUNIT = TimeUnit.SECONDSを; // keepAliveTimeが時間単位 プライベート 最終 int型、容量= 2000 //タスク保存キューの容量 @豆 @ConditionalOnProperty(接頭辞= " rocketmq.producer "、名前= " タイプ "、havingValue = " 取引 ") 公衆 TransactionMQProducer transactionMQProducer()はスロー MQClientExceptionを{ TransactionMQProducer transactionMQProducer = 新しい TransactionMQProducer(rocketMqProperties.getGroupName()); ExecutorServiceのExecutorServiceのは= 新しい(corePoolSize、maximumPoolSize、keepAliveTimeが、TIMEUNIT、ThreadPoolExecutorを 新しい ArrayBlockingQueue <Runnableを>(容量)、新しい ThreadFactory(){ @オーバーライド パブリックスレッドnewThread(RunnableをR){ スレッドのスレッド= 新しいスレッド(R) thread.setName( " クライアント・トランザクション-MSG-チェックスレッド "); リターンスレッド; } }); transactionMQProducer.setNamesrvAddr(rocketMqProperties.getNamesrvAddr())。 transactionMQProducer.setExecutorService(ExecutorServiceの)。 transactionMQProducer.start(); 返す transactionMQProducerを。 } }プロデューサーの送信ツール
コードの表示パッケージ com.gofun.customer.mqTrans; 輸入 com.alibaba.fastjson.JSON; 輸入 com.gofun.customer.mq.RocketMqProducerProperties。 輸入 org.apache.rocketmq.client.producer.DefaultMQProducer; 輸入 org.apache.rocketmq.client.producer.SendResult; 輸入 org.apache.rocketmq.client.producer.TransactionListener; 輸入 org.apache.rocketmq.client.producer.TransactionMQProducer; 輸入 org.apache.rocketmq.common.message.Message; 輸入 org.springframework.beans.factory.annotation.Autowired; 輸入 org.springframework.stereotype.Component; @成分 パブリック クラス RocketMqTransProducer { @Autowired プライベート TransactionMQProducer transactionMQProducer。 @Autowired プライベート RocketMqProducerProperties rocketMqProperties。 公共 のボイド setListener(TransactionListenerリスナー){ transactionMQProducer.setTransactionListener(リスナー)。 transactionMQProducer.setSendMsgTimeout(10000); } 公共 SendResult送信(文字列トピック、文字列タグ、オブジェクトobj){ メッセージmsg = 新しいメッセージ(トピック、タグ、getBody(OBJ)); SendResult sendResult = nullを。 してみてください { sendResult = transactionMQProducer.sendMessageInTransaction(MSG、NULL); } キャッチ(例外e){ } 返す sendResultを。 } 公共 SendResult送信(文字列タグ、オブジェクトobj){ メッセージmsg = 新しいメッセージ(rocketMqProperties.getTopicName()、タグ、getBody(OBJ))。 SendResult sendResult = nullを。 してみてください { sendResult = transactionMQProducer.sendMessageInTransaction(MSG、NULL); } キャッチ(例外e){ } 返す sendResultを。 } プライベート バイト [] getBody(オブジェクトobj){ 文字列のボディ= nullを。 もし(OBJ == NULL){ 戻り ヌル。 } もし(OBJ のinstanceof文字列){ 本体=(文字列)OBJ。 } 他 { 本体= JSON.toJSONString(OBJ)。 } リターン body.getBytes(); } }2、ローカル業務及びタイムアウトコールバックメソッドMQ
パッケージ com.gofun.customer.controller.test; 輸入 org.apache.rocketmq.client.producer.LocalTransactionState; 輸入 org.apache.rocketmq.client.producer.TransactionListener; 輸入 org.apache.rocketmq.common.message.Message; 輸入 org.apache.rocketmq.common.message.MessageExt; 輸入 org.springframework.stereotype.Component; 輸入 java.util.Randomの。 @成分 パブリック クラス TestTransactionListener 実装 TransactionListener { プライベート 静的 ブール transStatus = 真 ; / ** *地方事務の実施 * * @paramメッセージ * @param * @return * / @オーバーライド 公共 LocalTransactionState executeLocalTransaction(メッセージ・メッセージ、オブジェクトo){ System.out.println(「乱数シミュレーションローカルタスクで実行成功または失敗」); ランダムランダムは= 新しいランダムに(); transStatus = random.nextBoolean()。 もし(transStatus){ System.out.println( " ......成功した地元のタスクを実行する "); 戻り LocalTransactionState.COMMIT_MESSAGE。 } System.out.println( " .....ローカルタスクが失敗した実行 "); 戻り LocalTransactionState.ROLLBACK_MESSAGE。 } / ** * MQは長い時間のためにコミットメッセージを受信しない、ローカルトランザクション成功するかどうかをチェックするために、このメソッドを実行します * @param messageExt * @return * / @オーバーライド 公共 LocalTransactionState checkLocalTransaction(MessageExt messageExt){ System.out.println( " ローカルタスクの実行の成功または失敗を取得する "); IF(transStatus){ System.out.println( " ....地元のミッションの成功を決める"); 戻り LocalTransactionState.COMMIT_MESSAGE。 } System.out.println( " ....失敗したローカルタスクを決定する"); 戻り LocalTransactionState.ROLLBACK_MESSAGE。 } }
- インタフェースTransactionListenerを実装
- ローカルトランザクション実行executeLocalTransaction方法、および復帰に失敗した成功したリターンLocalTransactionState.COMMIT_MESSAGE、トランザクションが成功したかどうかを決定します。LocalTransactionState.ROLLBACK_MESSAGE。
- LocalTransactionState.ROLLBACK_UNKNOW中間状態は、メッセージは2つの試験結果の実行状態の待機中にチェックされています
- UNKNOWた状態で長い時間をMQときcheckLocalTransaction方法は、アクティブ状態要求確認メッセージを、このメソッドを呼び出します。
3、トランザクションメッセージを送信
1、ツールの導入は、トランザクションメッセージを送信しました
@Autowired プライベート RocketMqTransProducer rocketMqProducer。 @Autowired プライベート TestTransactionListener testTransactionListener。2、メッセージを送信
rocketMqProducer.setListener(testTransactionListener)。 SendResult = rocketMqProducer.send SendResult( " testtag "、 " 試験MQメッセージを送る... "); IF(!sendResult = ヌル){ SendStatus sendStatus = sendResult.getSendStatus()。 System.out.println( " 送信メッセージを返します: " + sendStatus.toString()); } 他 { System.out.println(「送信失敗メッセージ」)。 }
3、消費者
消費者と非トランザクション同じ消費者は、以下を参照してください。https://www.cnblogs.com/happydreamzjl/p/12022412.html
4、消費者の消費
- ローカルタスク障害(メッセージが正常に送信されていない)ときは、ローカルのミッションの成功メッセージの消費支出ではなく、消費者のニュースを見ることができます
転送:https://blog.csdn.net/Cy_LightBule/article/details/88891844