Допустим, у меня есть ситуация, когда мне нужно подождать до 1 минуты, чтобы выполнить какое-либо действие.
Если срок его действия истек, попробуйте другое действие.
Мой текущий Предложение решения основано на возможностях RabbitMQ.
Я бы создал следующие ресурсы:
@Bean
DirectExchange exchangeDirect() {
return new DirectExchange("exchange.direct");
}
@Bean
Queue bufferQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl", amqpProperties.getTimeToLive().toMillis());
args.put("x-dead-letter-exchange", "exchange.direct");
args.put("x-dead-letter-routing-key", "timedOutQueue");
return new Queue("buffer.queue", true, false, false, args);
}
@Bean
Queue timedOutQueue() {
return new Queue("timed.out.queue", true);
}
@Bean
Binding bufferQueueToExchangeDirect() {
return bind(bufferQueue())
.to(exchangeDirect())
.with("buffer.queue");
}
@Bean
Binding timedOutQueueToExchangeDirect() {
return bind(timedOutQueue())
.to(exchangeDirect())
.with("timed.out.queue");
}
Когда я добавляю действие к bufferQueue
и не получаю никаких обновлений доставки в течение 1 минуты, этот запрос затем перемещается на timedOutQueue
благодаря bufferQueue's
TTL.
Я могу присоединить слушателя приложения кролика к timedOutQueue
и использовать другое действие.
Когда я добавляю действие к bufferQueue
и я получаю подтверждение того, что действие было успешно выполнено, я хотел бы удалить данное событие действия из bufferQueue
.
Я не смог найти такую функцию в RabbitMQ, т.е. возможность получать выборочно.
Я также нашел несколько статей, в которых говорится, что выборочное потребление является антипаттерном.
Можно ли выборочно потреблять сообщения из очереди RabbitMQ?
Как правильно реализовать этот метод? такое шаблон в RabbitMQ?