個人の名刺:
ブロガー:酔っ払い。
個人プロフィール:ワインを満喫し、ワインのエネルギーで未来のために戦いましょう。
この記事は感動的です:三人で旅行するときは、私たちが先生にならなければなりません。
このプロジェクトは、ステーション Bのダークホース プログラマーである SpringCloud+RabbitMQ+Docker+Redis+search+distributed による Java「SpringCloud Microservice Technology Stack」に基づいています。
[SpringCloud+RabbitMQ+Docker+Redis+search+分散・詳細システム解説 springcloud マイクロサービス技術スタックコース | ダークホースプログラマー Java マイクロサービス]クリックして視聴
3. デッドレタースイッチ
2.TTL
キュー内のメッセージがタイムアウトして消費されない場合、そのメッセージはデッドレターになります。タイムアウトには 2 つの状況があります。
- メッセージが配置されているキューにはタイムアウトが設定されています
- メッセージ自体にはタイムアウトが設定されています
- タイムアウトしたデッドレターを受信するデッドレタースイッチ
コンシューマ サービスの SpringRabbitListener で、新しいコンシューマを定義し、デッド レター交換とデッド レター キューを宣言します。
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "dl.queue", durable = "true"),
exchange = @Exchange(name = "dl.direct", durable = "true", autoDelete = "false"),
key = "dl"
))
public void listenDlQueue(String msg) {
log.info("接收到dl.queue死信消息:{}", msg);
}
- キューを宣言してTTLを指定する
ttl キューのタイムアウトを設定するには、ttl キューを宣言するときに x-message-ttl (タイムアウト) 属性を設定する必要があります。同時にデッドレタースイッチをバインドします。そして、ttl スイッチが ttl キューにバインドされていることを宣言します。
只有在队列设置了死信交换机和死信路由键时,消息才会进入死信交换机。如果队列没有设置死信交换机或死信路由键,消息将会被直接丢弃。
@Bean
public Queue ttlQueue() {
return QueueBuilder
.durable("ttl.queue")
.ttl(10000)
.deadLetterExchange("dl.direct")
.build();
}
@Bean
public DirectExchange ttlExchange(){
return new DirectExchange("ttl.direct");
}
@Bean
public Binding ttlBinding(){
return BindingBuilder.bind(ttlQueue()).to(ttlExchange()).with("ttl");
}
メッセージを送信しますが、TTL は指定しません。
@Test
public void testTtl() {
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend("ttl.direct","ttl", "hello, ttl", correlationData);
log.info("消息发送成功:hell ttl");
}
送信メッセージのログ:
受信メッセージのログを確認します。
キューの TTL 値は 10000ms、つまり 10 秒であるためです。メッセージの送信と受信の時間差がちょうど 10 秒であることがわかります。
- メッセージ送信時にTTLを設定する
メッセージを送信するときに、TTL を指定してメッセージの有効期間を設定することもできます。
@Test
public void testTtl() {
//创建消息,并设置过期时间
Message message = MessageBuilder
.withBody("hello, ttl".getBytes(StandardCharsets.UTF_8))
.setExpiration("5000")
.build();
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
rabbitTemplate.convertAndSend("ttl.direct","ttl", message, correlationData);
log.info("消息发送成功:hell ttl");
}
送信されたメッセージのログを確認します。
メッセージログの受信:
今回は、送信と受信の間の遅延はわずか 5 秒です。キューとメッセージの両方に TTL が設定されている場合、期限切れになったメッセージはデッドレターになることに注意してください。
要約する
メッセージのタイムアウトには 2 つの方法がありますか?
- キューの ttl 属性を設定します。キューに入った後に ttl 時間を超えたメッセージはデッド レターになります。
- メッセージの ttl 属性を設定します。キューがメッセージを受信して ttl 時間を超えると、メッセージはデッド レターになります。
消費者がメッセージを受信する 20 秒前にメッセージを送信するにはどうすればよいでしょうか?
- メッセージの宛先キューのデッドレター スイッチを指定します。
- コンシューマがリッスンするキューをデッドレター交換にバインドします
- メッセージ送信時のメッセージまたはキューのタイムアウトを 20 秒に設定します。