RocketMQトランザクションメッセージ

MQ総務導入しました

MQトランザクション・メッセージ・フロー

  1. SEND_OK:プロデューサーのMQ、メッセージの状態にメッセージを送信します。このメッセージは、消費者には見えません(消費者がこのエントリのメッセージを消費することはできません)
  2. 地元のタスクを実行:成功、返すCOMMIT_MESSAGEを、今回の消費者はメッセージにこのエントリを消費することができます。エントリーMQ削除メッセージのこの時点で、ROLLBACK_MESSAGEを返すために失敗しました。
  3. メッセージは(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。
    }
}
  1. インタフェースTransactionListenerを実装
  2. ローカルトランザクション実行executeLocalTransaction方法、および復帰に失敗した成功したリターンLocalTransactionState.COMMIT_MESSAGE、トランザクションが成功したかどうかを決定します。LocalTransactionState.ROLLBACK_MESSAGE。
  3. LocalTransactionState.ROLLBACK_UNKNOW中間状態は、メッセージは2つの試験結果の実行状態の待機中にチェックされています
  4. 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、消費者の消費

画像

  1. ローカルタスク障害(メッセージが正常に送信されていない)ときは、ローカルのミッションの成功メッセージの消費支出ではなく、消費者のニュースを見ることができます

転送:https://blog.csdn.net/Cy_LightBule/article/details/88891844

        https://www.jianshu.com/p/5260a2739d80

おすすめ

転載: www.cnblogs.com/happydreamzjl/p/12023625.html