0

I am using RabbitMQ in spring boot for sending messages over microservices. I need to set up delay option for every message. This case I used MessageProperties file with Message and It likes this.

 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);

}

But I get only empty header and messages are not beaing delayed. Maybe I am using wrong way but I need right solution. My basic aim is that delay every message with specific time

2 Answers2

0

You seem to have some confusion:

properties.setHeader("x-delayed-type","direct");
properties.setHeader("x-delayed-message",true);

Those properties are exchange properties, not message properties.

To set the x-delay property, simply use properties.setDelay(15000).

Gary Russell
  • 166,535
  • 14
  • 146
  • 179
0

I have done it. The issue was related with plugin of RabbitMQ that is rabbitmq_delayed_message_exchange. I installed and enabled it. After that x-delay feature worked