RabbitMQ implements delay queue one: set TTL on the queue
Publish --> delaysync.exchange --> delay.5m.queue (delay queue) --> delay.exchange --> test.queue (normal queue) --> Consumer
// Delay queue start Map<String,Object> map = new HashMap<String,Object> (); map.put( "x-message-ttl", 10000); // Message expiration time map.put("x-max-length", 500000); // Maximum number of messages backlog map.put("x- dead-letter-exchange", "delay.exchange"); // The message will be delivered to delay.exchange after it expires channel.queueDeclare("delay.5m.queue", true , false , false , map);
RabbitMQ implements delay queue 2: setting TTL on messages
Publish --> default exchange --> delay_queue (delay queue) --> amq.direct --> message_ttl_queue (normal queue) --> Consumer
queue:
// Delayed queue Map<String,Object> arguments = new HashMap<String,Object> (); arguments.put( "x-dead-letter-exchange", "amq.direct"); // The message will be delivered to amq.direct after expiration arguments.put("x-dead-letter-routing-key", "message_ttl_routingKey "); // After the dead letter appears, it will be sent again according to the specified routing-key channel.queueDeclare("delay_queue", true , false , false , arguments);
Message sending:
// Set delay properties AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder(); // deliveryMode: 1. Non-persistent, 2. Persistence AMQP.BasicProperties properties = builder.expiration("10000").deliveryMode (2 ).build(); channel.basicPublish("", "delay_queue", properties, msg.getBytes());