RabbitMQ 的延迟功能不起作用
Delay feauture of RabbitMQ is not working
我在 spring 引导中使用 RabbitMQ 通过微服务发送消息。我需要为每条消息设置延迟选项。这种情况下,我将 MessageProperties 文件与 Message 一起使用,它喜欢这样。
MessageProperties properties = new MessageProperties();
properties.setDelay(15000);
properties.setContentType(ContentType.APPLICATION_JSON.getMimeType());
properties.setType("direct");
properties.setHeader("x-delay",15000);
properties.setHeader("x-delayed-type","direct");
properties.setHeader("x-delayed-message",true);
Message forSms = MessageBuilder.withBody(SerializationUtils.serialize(updatedAppointment.getId())).andProperties(properties).setCorrelationId(correlationIdForSms.getBytes()).setHeader("x-delay", 20000).setHeaderIfAbsent("x-delay", 20000).build();
rabbitTemplate.send("auto.exch", "orderRoutingKey", forSms);
and I handle it in this function:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "myQueue", durable = "true"),arguments = @Argument(name = "x-delay",value = "15000",type = "java.lang.Integer"),
exchange = @Exchange(value = "auto.exch", delayed ="true",ignoreDeclarationExceptions = "true",arguments = @Argument(name = "x-delayed-type",value = "direct"), type = ExchangeTypes.HEADERS),
key = "orderRoutingKey")
)
public void sendMessagePatientPhone(final Message message) throws EntityNotFoundException {
Long appointmentId = (Long) SerializationUtils.deserialize(message.getBody());
String correlationId = new String(message.getMessageProperties().getCorrelationId());
Appointment appointment = appointmentService.findById(appointmentId);
User user = appointment.getPatient().getUser();
String msg = "Teleconference is started after " + formattedTime(user.getNotificationPeriodForSms());
sendSms(user, msg);
}
但我只得到空的 header 并且消息没有被延迟。也许我用错了方法,但我需要正确的解决方案。我的基本目标是在特定时间延迟每条消息
你好像有些困惑:
properties.setHeader("x-delayed-type","direct");
properties.setHeader("x-delayed-message",true);
这些属性是交换属性,而不是消息属性。
要设置 x-delay
属性,只需使用 properties.setDelay(15000)
。
我做到了。该问题与 rabbitmq_delayed_message_exchange 的 RabbitMQ 插件有关。我安装并启用了它。之后 x-delay 功能起作用了
我在 spring 引导中使用 RabbitMQ 通过微服务发送消息。我需要为每条消息设置延迟选项。这种情况下,我将 MessageProperties 文件与 Message 一起使用,它喜欢这样。
MessageProperties properties = new MessageProperties();
properties.setDelay(15000);
properties.setContentType(ContentType.APPLICATION_JSON.getMimeType());
properties.setType("direct");
properties.setHeader("x-delay",15000);
properties.setHeader("x-delayed-type","direct");
properties.setHeader("x-delayed-message",true);
Message forSms = MessageBuilder.withBody(SerializationUtils.serialize(updatedAppointment.getId())).andProperties(properties).setCorrelationId(correlationIdForSms.getBytes()).setHeader("x-delay", 20000).setHeaderIfAbsent("x-delay", 20000).build();
rabbitTemplate.send("auto.exch", "orderRoutingKey", forSms);
and I handle it in this function:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "myQueue", durable = "true"),arguments = @Argument(name = "x-delay",value = "15000",type = "java.lang.Integer"),
exchange = @Exchange(value = "auto.exch", delayed ="true",ignoreDeclarationExceptions = "true",arguments = @Argument(name = "x-delayed-type",value = "direct"), type = ExchangeTypes.HEADERS),
key = "orderRoutingKey")
)
public void sendMessagePatientPhone(final Message message) throws EntityNotFoundException {
Long appointmentId = (Long) SerializationUtils.deserialize(message.getBody());
String correlationId = new String(message.getMessageProperties().getCorrelationId());
Appointment appointment = appointmentService.findById(appointmentId);
User user = appointment.getPatient().getUser();
String msg = "Teleconference is started after " + formattedTime(user.getNotificationPeriodForSms());
sendSms(user, msg);
}
但我只得到空的 header 并且消息没有被延迟。也许我用错了方法,但我需要正确的解决方案。我的基本目标是在特定时间延迟每条消息
你好像有些困惑:
properties.setHeader("x-delayed-type","direct");
properties.setHeader("x-delayed-message",true);
这些属性是交换属性,而不是消息属性。
要设置 x-delay
属性,只需使用 properties.setDelay(15000)
。
我做到了。该问题与 rabbitmq_delayed_message_exchange 的 RabbitMQ 插件有关。我安装并启用了它。之后 x-delay 功能起作用了