このトピックに関する複数の回答を読みましたが、構成は適切に機能するはずですが、何らかの理由で機能しません。
構成は次のとおりです。
@Bean Queue intakeQueue(String name) { return new Queue(name, true); }
@Bean Exchange dlx(String name) { return new DirectExchange(name); }
@Bean Queue dlq(String name) { return new Queue(name, false, false, true); }
@Bean
Binding dlb(Exchange dlx, Queue dlq, Queue reply) {
return BindingBuilder.bind(dlq).to(dlx).with(reply.getName()).noargs();
}
@Bean
Queue replyQueue(String name, Exchange dlx) {
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", dlx.getName());
args.put("x-dead-letter-routing-key", name);
return new Queue(name, true, false, false, args);
}
RabbitMQ UI は、応答キューにDLX
とDLK
属性があることを示しています。
みたいなメッセージを送ります
this.rabbit.convertSendAndReceive(intakeQueue, obj, message -> {
message.getMessageProperties().setPriority(10);
return message;
});
メッセージ ハンドラーAmqpRejectAndDontRequeueException
は、メッセージを受信した直後にスローします。これは、テストのみを目的として意図的に行われます。再試行のアドバイスから始めましたが、結果が得られなかったため、テスト ケースを単純化しました。
public Object handleMessage(Object obj) throws IOException {
throw new AmqpRejectAndDontRequeueException("Testing retries!");
}
現在、次の 2 つの問題が発生しています。
- ARADRE がスローされた後、メッセージが DLQ に表示されません。でも直接DLQにパブリッシュすればOK
handleMessage
です。 convertSendAndReceive
何も返されず(例外かもしれませんか?)、タイムアウトが発生するまで待機します。これは私の場合は5分です。意図したものかもしれませんが、RPC スタイルの呼び出しの場合はかなり奇妙です。
何かを見逃したり、設定を誤ったりしましたか?