Передача динамического списка очередей в слушатель очереди - PullRequest
0 голосов
/ 14 января 2019

У меня есть приложение Spring Boot, которое раскручивает потребителей для раздела очередей, и я хочу иметь возможность добавлять очереди к этим потребителям во время выполнения.

Я установил плагин для обмена событиями (https://www.rabbitmq.com/event-exchange.html)) и создал выделенную очередь, связанную с обменом amq.rabbitmq.event. Я вижу, как происходят события, когда я статически объявляю очереди.

Как бы я справился с магией во время выполнения? Я видел, как люди используют файл свойств, но я бы предпочел не изменять файл свойств во время выполнения, так как я добавляю больше очередей

@Component
public class MessageConsumer {

    List<String> allQueues = new ArrayList<String>();

    public MessageConsumer() {
        allQueues.add("queue1");
        allQueues.add("queue2");
        allQueues.add("queue3");
    }

    @RabbitListener(id = "event", queues = {"custom-emp-queue-events"}) // create this queue in rabbitmq management, bound to amqp exchange
    public void processQueueEvents(Message message) {
        ... add the queue to the allQueues list on queue.created ...
    }

    @RabbitListener(id = "process", queues = allQueues.stream().toArray(String[]::new) ) // this is where the "issue" is
    public void processMessageFromQueues(String messageAsJson) {
        ... process message ...
    }
}

1 Ответ

0 голосов
/ 14 января 2019

Это можно сделать с помощью выражения SpEL там:

@RabbitListener(id = "process", queues = "#{messageConsumer.allQueues}" )

Но для этого нужно добавить публичный геттер allQueues.

См. Дополнительную информацию в Справочном руководстве: https://docs.spring.io/spring-amqp/docs/2.1.3.RELEASE/reference/html/_reference.html#async-annotation-driven

UPDATE

@Autowired
private RabbitListenerEndpointRegistry listenerEdnpointRegistry;

@RabbitListener(id = "event", queues = {"custom-emp-queue-events"}) // create this queue in rabbitmq management, bound to amqp exchange
public void processQueueEvents(Message message) {
    ((AbstractMessageListenerContainer) this.listenerEdnpointRegistry.getListenerContainer("process")).addQueueNames(...);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...