我无法确定在SpringAMQP中延迟消息级别的方法。 我调用Web服务如果服务不可用或者它抛出一些异常我将所有请求存储到RabbitMQ队列中并且我继续重试服务调用,直到它成功执行。如果服务不断抛出错误或者它不可用,那么rabbitMQ监听器将继续循环。(意思是监听器检索消息并在消息重新排队时发出服务调用)
我使用MessagePostProcessor限制循环直到X小时但是我想在消息级别和每次尝试访问服务时启用延迟。例如,第一次尝试3000ms延迟,第二次尝试6000ms,直到我尝试x次。
如果您提供一些示例,那就太棒了。
请你就此提出一些想法吗?
答案 0 :(得分:1)
嗯,你不可能这样做。
消息重新排队与事务rallback完全相似,系统返回异常之前的状态。所以,绝对不能修改消息以返回队列。
可能你必须查看Spring Retry项目是出于同样的原因,并且只从队列中轮询一次消息并在内存中重试,直到成功回答或重试策略耗尽为止。最后,您只需从队列中删除消息或将其移至DLQ。
查看Reference Manual中的更多信息。
答案 1 :(得分:1)
I added CustomeMessage delay exchange
@Bean
CustomExchange delayExchange() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
return new CustomExchange("delayed-exchange", "x-delayed-message", true, false, args);
}
Added MessagePostProcessor
if (message.getMessageProperties().getHeaders().get("x-delay") == null) {
message.getMessageProperties().setHeader("x-delay", 10000);
} else {
Integer integer = (Integer) message.getMessageProperties().getHeaders().get("x-delay");
if (integer < 60000) {
integer = integer + 10000;
message.getMessageProperties().setHeader("x-delay", integer);
}
}
First time it delays 30 seconds and adds 10seconds each time till it reaches 600 seconds.This should be configurable.
And finally send the message to
rabbitTemplate.convertAndSend("delayed-exchange", queueName,message, rabbitMQMessagePostProcessor);