根据RabbitMQ中的邮件正文属性有选择地使用邮件

问题描述 投票:0回答:1

假设我有一种情况,我需要等待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 amqp spring-amqp
1个回答
0
投票

RabbitMQ中没有消息选择的概念。

对于希望有选择地接收消息的应用程序,“正确”的方法是在消费者表示感兴趣的每个特定队列上与使用者一起使用多个队列/路由键。

但是,无法从队列中间“删除”消息;只有头。

当我将操作添加到bufferQueue并收到确认操作已成功执行的确认时,我想从bufferQueue中删除给定的操作事件。

对我来说这毫无意义;当由于TTL而导致bufferQueue中的消息超时并被移至timedOutQueue时,该消息不再存在于bufferQueue中,因此没有要删除的内容。

也没有机制...

而且我在1分钟内未收到任何交货更新,

...,因为队列中的每个消息都是独立的。

听起来您的应用程序根本不适合消息代理。

© www.soinside.com 2019 - 2024. All rights reserved.