再試行メカニズム
MQは、多くの場合、複雑な分散システムでは、関係なく、ネットワークの変動、サービスのダウンタイム、プログラムの異常の要因、失敗はメッセージや消費者問題を送信するので可能性が生じます。そのため、再試行は、すべてのMQミドルウェアは、アカウントにメッセージのキーポイントを取る必要があります。何のメッセージの再試行がない場合は、メッセージの損失は、システムに重大な影響を与える可能性がある問題を生じる可能性があります。だから、ビングChengningは、より多くのメッセージよりも、メッセージはすべてのMQメッセージの再試行のほとんどが良いサポートを提供し、原則的に失われることができないこと。
ユーザRocketMQリトライ処理フロー、手動操作することなく、開発者にメッセージをカプセル化します。生産側と消費者側カテゴリの再試行メカニズムをサポートしていRocketMQ。
生産リトライ終了のシミュレーション
二つの状態の消費者のニュース消費終わり:
パッケージcom.alibaba.rocketmq.client.consumer.listener。
パブリック 列挙ConsumeConcurrentlyStatus {
CONSUME_SUCCESS、
RECONSUME_LATER。
プライベートConsumeConcurrentlyStatus(){
}
}
成功(CONSUME_SUCCESS)、および失敗した(RECONSUME_LATER)を再試行しています。
消費者の消費量は、それが消費者に成功したことを明らかにした側を使用するには、メッセージの成功を確保するために、リターンCONSUME_SUCCESSは、RocketMQは、メッセージコンシューマの成功を思うだろう。
メッセージコンシューマが失敗した場合、単純にConsumeConcurrentlyStatus.RECONSUME_LATERを返し、RocketMQの消費者は、メッセージは、再配信する必要が失敗したと思います。
1.異常
パッケージcom.wn.consumer。
輸入com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
輸入com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
輸入com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
輸入com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
輸入com.alibaba.rocketmq.client.exception.MQClientException。
輸入com.alibaba.rocketmq.common.message.MessageExt;
輸入はjava.util.List;
パブリック クラスMQConsumer {
公共 静的 ボイドメイン(文字列[]引数)がMQClientException {スロー
// 创建消费者
= DefaultMQPushConsumerコンシューマを新新 DefaultMQPushConsumer(" RMQ-グループ" );
// セットネームサーバアドレス
consumer.setNamesrvAddr(" 192.168.138.187:9876;192.168.138.188:9876 " );
// 消費者のインスタンスのセットの名前
consumer.setInstanceName(" 消費者" )。
// トピック購読
Consumer.subscribe(" WN02 "、" 多賀の" );
//はメッセージをリッスン
consumer.registerMessageListener(新新公衆 MessageListenerConcurrently(){
@Override
ConsumeConcurrentlyStatus consumeMessage(一覧<MessageExt> リスト、ConsumeConcurrentlyContext consumeConcurrentlyContext){
// 获取消息
について(MessageExt MSG:リスト){
システム。アウト .println(msg.getMsgId()+ " --- " + 新しい文字列(msg.getBody()));
}
試みる{
INT iは= 1 / 0 。
} キャッチ(例外e){
e.printStackTrace();
// 需要重试
リターンConsumeConcurrentlyStatus.RECONSUME_LATER;
}
// 消息成功
リターンConsumeConcurrentlyStatus.CONSUME_SUCCESS。
}
})。
consumer.start();
システム。外 .println(" 消費者は、開始します... " );
}
}
2.ネットワークの遅延
パッケージcom.wn.consumer。
輸入com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
輸入com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
輸入com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
輸入com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
輸入com.alibaba.rocketmq.client.exception.MQClientException。
輸入com.alibaba.rocketmq.common.message.MessageExt;
輸入はjava.util.List;
パブリック クラスMQConsumer {
公共 静的 ボイドメイン(文字列[]引数)がMQClientException {スロー
// 创建消费者
= DefaultMQPushConsumerコンシューマを新新 DefaultMQPushConsumer(" RMQ-グループ" );
// セットネームサーバアドレス
consumer.setNamesrvAddr(" 192.168.138.187:9876;192.168.138.188:9876 " );
// 消費者のインスタンスのセットの名前
consumer.setInstanceName(" 消費者" )。
// トピック購読
Consumer.subscribe(" wn03 "、" 多賀の" );
// メッセージをリスン
consumer.registerMessageListener(新新MessageListenerConcurrently(){
@Override
公衆ConsumeConcurrentlyStatus consumeMessage(一覧<MessageExt> リスト、ConsumeConcurrentlyContext consumeConcurrentlyContext){
// 获取消息
について(MessageExt MSG:リスト){
システム。アウト .println(msg.getMsgId()+ " --- " + 新しい文字列(msg.getBody()));
}
// 网络延迟
試み{
のThread.sleep(600000 )。
} キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}
//消息成功
返すConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
})。
consumer.start();
システム。外 .println(" 消費者は、開始します... " );
}
}