问题
I've got a project where we are going to have hundreds (potentially thousands) of queues in rabbit and each of these queues will need to be consumed by a pool of consumers.
In rabbit (using spring-amqp), you have the rabbitlistener annotation which allows me to statically assign the queues this particular consumer(s) will handle.
My question is - with rabbit and spring, is there a clean way for me to grab a section of queues (lets say queues that start with a-c) and then also listen for any queues that are created while the consumer is running.
Example (at start):
- ant-queue
- apple-queue
- cat-queue
While consumer is running:
- Add bat-queue
Here is the (very simple) code I currently have:
@Component
public class MessageConsumer {
public MessageConsumer() {
// ideally grab a section of queues here, initialize a parameter and give to the rabbitlistener annotation
}
@RabbitListener(queues= {"ant-queue", "apple-queue", "cat-queue"})
public void processQueues(String messageAsJson) {
< how do I update the queues declared in rabbit listener above ? >
}
}
Edit:
I should add - I've gone through the spring amqp documentation I found online and I haven't found anything outside of statically (either hardcoded or via properties) declaring the queues
回答1:
Inject (
@Autowired
or otherwise) theRabbitListenerEndpointRegistry
.Get a reference to the listener container (use the
id
attribute on the annotation to give it a known id) (registry.getListenerContainer(id)
).Cast the container to an
AbstractMessageListenerContainer
and calladdQueues()
oraddQueueNames()
.
Note that is more efficient to use a DirectMessageListenerContainer
when adding queues dynamically; with a SimpleMessageListenerContainer
the consumer(s) are stopped and restarted. With the direct container, each queue gets its own consumer(s).
See Choosing a container.
来源:https://stackoverflow.com/questions/54094994/dynamic-addition-of-queues-to-a-rabbit-listener-at-runtime