我有以下问题需要解决:我正在尝试使用RabbitMQ消息实现一个简单的延迟重试机制。我有一个基础设施,它为我提供了传递消息的延迟。我可以有许多感兴趣的参与者,他们希望在运行时利用这种延迟重试机制。
参与者只想向我提供两个详细信息和消息: 1.他们希望在延迟T秒后将消息传递到的队列名称。2.队列的消费者(比如消息的消费者)。
我尝试做了以下几件事:
private void startSeparateListener(final Object messageConsumer,
final Queue queue) {
SimpleMessageListenerContainer simpleMessageListenerContainer
= myCustomeSimpleMessageListenerFactory.create();
simpleMessageListenerContainer.setRabbitAdmin(rabbitAdmin);
simpleMessageListenerContainer.setQueues(queue);
simpleMessageListenerContainer.setMessageListener(new MessageListenerAdapter(messageConsumer));
simpleMessageListenerContainer.start();
}请注意,队列已经被创建并注册到rabbitadmin,并且对象使用者有一个名为handleMessage的方法来监听队列。
这是在运行时向队列的消息使用者动态注册队列的正确方式吗?
注意: Spring已经提供了一个SimpleMessageListenerContainer类型的bean,但是使用该bean动态添加队列和消费者是否会导致Q1的意外消费者作为另一个队列的接收者的一部分而被调用,比如Q2,其内容类型可能与Q1相同?
我试着搜索了很多关于它的信息,但是没有得到任何具体的解释。如果这是一个重复的问题,请提前道歉,并为任何天真而道歉。
发布于 2017-12-18 22:47:54
我不能以某种方式编译你的问题,但我能告诉你的是,在RabbitMQ和Sring supports它很好地已经有了失效的交换解决方案。
我建议远离动态添加的SimpleMessageListenerContainer:它并不像看起来那么简单。有一个像addQueueNames()这样的选项
/**
* Add queue(s) to this container's list of queues. The existing consumers
* will be cancelled after they have processed any pre-fetched messages and
* new consumers will be created. The queue must exist to avoid problems when
* restarting the consumers.
* @param queueName The queue to add.
*/
@Override
public void addQueueNames(String... queueName) {因此,您可以考虑不添加新的容器,而是向现有的队列添加新的队列。由amqp_consumerQueue进行的下游路由可能有助于区分来自不同队列的消息。
https://stackoverflow.com/questions/47866755
复制相似问题