假设我有一种情况,我需要等待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
TTL,此请求随后被移至bufferQueue's
。
我可以将应用程序兔子侦听器附加到timedOutQueue
并使用其他操作。
[当我向bufferQueue
添加动作并且收到确认已成功执行动作的确认时,我想从bufferQueue
中删除给定的动作事件。
我在RabbitMQ中找不到这样的功能,即能够选择性地接收。
[我也发现一些文章说选择性消费是反模式。
是否可以有选择地使用RabbitMQ队列中的消息?
在RabbitMQ中实现此模式的正确方法是什么?
RabbitMQ中没有消息选择的概念。
对于希望有选择地接收消息的应用程序,“正确”的方法是在消费者表示感兴趣的每个特定队列上与使用者一起使用多个队列/路由键。
但是,无法从队列中间“删除”消息;只有头。
当我将操作添加到bufferQueue并收到确认操作已成功执行的确认时,我想从bufferQueue中删除给定的操作事件。
对我来说这毫无意义;当由于TTL而导致bufferQueue
中的消息超时并被移至timedOutQueue
时,该消息不再存在于bufferQueue
中,因此没有要删除的内容。
也没有机制...
而且我在1分钟内未收到任何交货更新,
...,因为队列中的每个消息都是独立的。
听起来您的应用程序根本不适合消息代理。