目次
1. Dead Letter Exchange (デッドレターエクスチェンジ)
1. Dead Letter Exchange (デッドレターエクスチェンジ)
RabbitMQ は、高度なメッセージング ミドルウェアとして、デッド レター エクスチェンジャーの概念を提案しています。
このエクスチェンジャは、デッド メッセージの処理に特化しています (拒否され、再配信できるメッセージはデッド メッセージとはみなされません)。メッセージがデッドレターになる場合は、一般に 3 つの状況があります。
1. メッセージが拒否され、requeue パラメータが false に設定されている。
2. メッセージが期限切れになる (Rabbit のメッセージはデフォルトでは期限切れになりませんが、キューの有効期限とメッセージの有効期限は、メッセージの有効期限の効果を達成する時間を設定できます)
3. 上記の 3 つの条件が満たされると、キューが最大長に達します (通常、キューの長さまたはサイズの最大値が設定され、最大値に達すると)
メッセージはデッド レター メッセージとなり、メッセージはデッド レター メッセージになり、対応するキューに配信されます。デッドレタースイッチです。
対応するキューをリッスンするだけで、デッドレター メッセージの最終処理を実行できます。
オーダータイムアウト処理
プロデューサは、1 分後にタイムアウトになる注文メッセージを生成し、通常の交換 Exchange-a に送信します。メッセージはキュー queue-a と一致しますが、1 分経過しても消費されません。メッセージはデッド レター エクスチェンジ dlx-exchange に配信され、プライベート メッセージ キューのデッド レター キュー dlx-queue に送信されます。メッセージを受信した後、デッド レター キュー
dlx-queue のコンシューマは、メッセージのステータスをクエリします。メッセージに基づいて注文します。まだ未払いの場合は、注文ステータスが更新されます。タイムアウトステータス
スイッチのプロパティ:
名前: スイッチ名
タイプ: スイッチのタイプ、ダイレクト、トピック、ファンアウト、ヘッダー
耐久性: 永続性が必要かどうか 永続性が必要な場合、スイッチは RabbitMQ の再起動後も存在します 自動削除: 最後のスイッチが Exchange にバインドされたときキューが削除されると、交換は自動的に削除されます。ExchangeInternal: 現在の Exchange が RabbitMQ によって内部的に使用されているかどうか、デフォルトは False、引数: AMQP プロトコルのカスタマイズされた使用を拡張するために使用される拡張
パラメータ
2. コードデモ
1.プロバイダー
①.DeadConfig
package com.example.provider.mq;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
@SuppressWarnings("all")
public class DeadConfig {
//1.需要正常的交换机
//2.正常队列发出消息(具备配置)
//3.具备死信交换机,队列
@Bean
public Queue normalQueue(){
Map<String,Object> config=new HashMap<>();
//过期时间
config.put("x-message-ttl", 10000);
//死信交换机
config.put("x-dead-letter-exchange", "deadExchange");
//死信routing key
config.put("x-dead-letter-routing-key", "DD");
return new Queue("normalQueue",true,false,false,config);
}
@Bean
public Queue deadQueue(){
return new Queue("deadQueue",true);
}
@Bean
public DirectExchange normalExchange() {
return new DirectExchange("normalExchange");
}
@Bean
public DirectExchange deadExchange() {
return new DirectExchange("deadExchange");
}
@Bean
public Binding normalBinding() {
return BindingBuilder.bind(normalQueue()).to(normalExchange()).with("CC");
}
@Bean
public Binding deadBinding() {
return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("DD");
}
}
②.ProviderController
@RequestMapping("/deadSend")
public String deadSend(){
log.warn("订单已经保存");
//保存了一个订单
template.convertAndSend("normalExchange","CC","order11888");
return "yes";
}
2.消費者
①.デッドレシーバー
package com.example.consumer.mq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@SuppressWarnings("all")
@RabbitListener(queues = "deadQueue")
@Slf4j
public class DeadReceiver {
@RabbitHandler
public void process(String message){
log.warn(message+":该订单已经过期");
}
}