【RabbitMQ】@RabbitListenerの使用と誤報死サイクルの解析
問題の再現:
先行知識:
一、@RabbitListenerの使用
1.1方法に作用する
キュー名を指定し、複数の指定キューの消費方法一般用法 1.2クラスに作用する
指定キュー名、は に協力する必要がある.注記オプションパラメータ: 二、メッセージのカプセル化クラスキー属性 を拘束する http://localhost:15672RabbitMQのコンソール へメッセージの設定 content_type
handlerの受信可能パラメータ
text/plain
String
application/json
/
application/x-java-serialized-object
エンティティークラス
application/octet-stream
byte[]
指定されていません
byte[]
指定されていません
org.springframework.amqp.core.Message
例外キャプチャ
まず誤りを分析してからデッドサイクルを分析する
【異常1】:No method found for class
とは、
異常1問題:なぜ消費実現が見つからないのか.
異常1問題:処理構想方法パラメータとして .できるだけ をします.
異常1分析:デッドサイクル分析
これはアプリケーションレベルのデッドサイクルであり、メッセージは消費実装が見つからず、消費実装が見つかるまで再試行されます.このようなデッドサイクルの原因は配置ミスであり,ソースで避けるにはテスト段階で消滅しなければならない.【このようなデッドサイクルを解消する方法を見つけて穴を埋める】.もう1つの処理しなければならない死の循環はすでに消費の実現を見つけたが、消費の過程で死の循環をもたらし、異常2を見た.
【異常2】消費中に未キャプチャExceptionを投げ出す
通常、ビジネスロジックによる異常は
異常2問題:
詳細な分析ここでは、
例外クラス
MessageConversionException
MessageConversionException
MethodArgumentNotValidException
MethodArgumentTypeMismatchException
NoSuchMethodException
ClassCastException
異常2処理:デッドサイクル終了
最も簡単な方法は、
より堅牢な方法:異常プロセッサ+デッドラインキューを使用してネット上の資料を参照し、比較的包括的です.
ソリューション試験段階暴力放出 線上不暴力放出 は再試行回数を超え、メッセージをデッドメッセージキューに追加するか、dbに永続化し、メッセージキューから を一時的に除去する.失敗したメッセージに基づいてアラートを行い、 をトリガする.
リファレンス
RabbitMQの用語とパラメータ構成@RabbitListener詳細@RabbitListener詳細,@Payload,@headers MessageConvertシーケンス化関連Spring Boot 2.0でのRabbitMQの異常処理
docker
で対応するキュー情報をクリアexec rabbitmq /bin/bash #rabbitmq , Id
rabbitmqctl purge_queue queue.order # queue.order
RabbitMQ
、消費者の消費を待つhttp://localhost:15672 先行知識:
一、@RabbitListenerの使用
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-amqpartifactId>
dependency>
1.1方法に作用する
キュー名を指定し、複数の
@RabbitListenerを使用して、複数の消費実装をバインドできます.@RabbitListener(queues = "queue.order")
public void handleMsg(String msg) {
}
指定キュー名、
に@RabbitListener
指定キュー名を配置します.@RabbitHandler
クラス内の複数の
にバインドされ、キュー名の複数の消費実装とみなされる@RabbitHandler
@RabbitListener(queues = "queue.order")
public class PayOrderUpdateListener {
//
@RabbitHandler
public void handlerMsg(String msg) {
}
}
@RabbitListener(isDefault = true)
、このパラメータは注意に値する@RabbitHandler(queues = "queue.order", isDefault = true)
public void handleMsg(String msg) {
}
Message
、及び解析規則@RabbitHandler(queues = "queue.order")
public void handleMsg(Message msg) {
}
content_type
bodyコンテンツcontent_type
content_type
の一般的な値handlerの受信可能パラメータ
text/plain
String
application/json
/
application/x-java-serialized-object
エンティティークラス
application/octet-stream
byte[]
指定されていません
byte[]
指定されていません
org.springframework.amqp.core.Message
content_type
が指定されていない場合はbyte[]で受信できますが、Message
は可能なすべてのシーケンス化シーンを受信するために使用でき、エラーは報告されません.例外キャプチャ
まず誤りを分析してからデッドサイクルを分析する
【異常1】:No method found for class
とは、
が消費の準備をしており、キューにメッセージが存在するが、指定された消費実現方法が見つからないことを意味する.異常1問題:なぜ消費実現が見つからないのか.
@RabbitListener
または@RabbitHandler
の構成エラーは、content_type
の構成および方法に依存する
に起因する.クライアントを介してキューにcontent_が挿入された場合typeが空のメッセージ,@RabbitListenerはStringのHandlerとして形参のみであり,上消費に対応して実現することはできない.@RabbitHandler
オプションパラメータisDefault
を使用していない消費者は、消費実装が見つからない場合は、isDefault = true
のhandler
を探して、ポケット戦略に似ています.異常1問題:処理構想
Message
を用いる@RabbitListener
をクラスに置いて、@RabbitHandler(isDefault = true)
を使ってポケット戦略異常1分析:デッドサイクル分析
これはアプリケーションレベルのデッドサイクルであり、メッセージは消費実装が見つからず、消費実装が見つかるまで再試行されます.このようなデッドサイクルの原因は配置ミスであり,ソースで避けるにはテスト段階で消滅しなければならない.【このようなデッドサイクルを解消する方法を見つけて穴を埋める】.もう1つの処理しなければならない死の循環はすでに消費の実現を見つけたが、消費の過程で死の循環をもたらし、異常2を見た.
【異常2】消費中に未キャプチャExceptionを投げ出す
通常、ビジネスロジックによる異常は
NullPointerException
、脳のないやり方はtry-catch
であり、処理が適切でないと死の循環をもたらす.異常2問題:
try-catch
以降もデッドサイクル詳細な分析ここでは、
RabbitMQ
のデフォルトの例外ポリシーは
であり、fatal
のタイプの例外が投げ出されない限り、この例外タイプは次のようになります.例外クラス
MessageConversionException
MessageConversionException
MethodArgumentNotValidException
MethodArgumentTypeMismatchException
NoSuchMethodException
ClassCastException
NullPointerException
と同様に、再試行の範囲を放棄しない、すなわち、アクティブにキャプチャして処理しない、RabbitMQ
はメッセージを消費しようと試み続け、デッドサイクルを招き、大量のCPUリソースを占有する.異常2処理:デッドサイクル終了
最も簡単な方法は、
catch
文ブロックにfatal
型の異常を投げ出すことである. @RabbitHandler
public void handlerMsg(String msg) {
try {
// try
//1. map
Map<String, String> map = JSON.parseObject(msg, Map.class);
String out_trade_no = map.get("out_trade_no");
if (map != null && map.get("return_code").equalsIgnoreCase("SUCCESS")) {
}
} catch (Exception e) {
e.printStackTrace();
// todo bug
throw new MessageConversionException(" , , ");
}
}
より堅牢な方法:異常プロセッサ+デッドラインキューを使用してネット上の資料を参照し、比較的包括的です.
ソリューション
fatal
異常、死循環停止fatal
異常、先に再試行回数を設定し、詳細パラメータ API
または他の方法で手動介入リファレンス
RabbitMQの用語とパラメータ構成@RabbitListener詳細@RabbitListener詳細,@Payload,@headers MessageConvertシーケンス化関連Spring Boot 2.0でのRabbitMQの異常処理