您可以通过设置「maximumRedeliveryAttempts」来解决此问题,该属性将Amqp延迟重定向到队列中以进行重试。下面是一个示例代码片段:
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setUri(rabbitMQConnectionUri);
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
Map queueArgs = new HashMap<>();
queueArgs.put("x-dead-letter-exchange", "your-exchange-name");
queueArgs.put("x-dead-letter-routing-key", "your-routing-key-name");
channel.queueDeclare("my-queue-name", true, false, false, queueArgs); // Queue arguments
AMQP.BasicProperties basicProperties = new AMQP.BasicProperties().builder()
.deliveryMode(2)
.expiration("30000") // This is the time after which your message will expire
.build();
channel.basicPublish("your-exchange-name", "your-routing-key-name", basicProperties, "message-payload".getBytes());
// Receiving messages from the queue
channel.basicConsume("my-queue-name", false, new YourConsumer());
上述示例代码中的「queueArgs」是创建队列时使用的参数,它将死信交换器的名称(「x-dead-letter-exchange」)和死信路由键的名称(「x-dead-letter-routing-key」)指定为对消息进行重试的范围。
请注意,上述示例中的消息将在30秒后过期并被删除。如果消息未能成功处理,则将按照此设置进行重试。如果您不希望消息被删除,请将该值设置为0。