Использовать несколько очередей ActiveMQ через один ActiveMQConnectionFactory

1

Мое приложение обрабатывает входящие сообщения, которые помещаются в одну очередь ActiveMQ (с именем "incoming.queue"). У меня есть MessageListener, который обрабатывает сообщения, и все работает хорошо. Моя конфигурация Java ниже:

@Configuration
@ComponentScan(basePackages="uk.co.domain")
public class JmsConfig {

    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
        activeMQConnectionFactory.setBrokerURL("tcp://localhost:61616");
        return activeMQConnectionFactory;
    }

    @Bean
    public DefaultMessageListenerContainer jmsListenerContainer() {
        DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
        dmlc.setConnectionFactory(connectionFactory());
        dmlc.setDestination(new ActiveMQQueue("incoming.queue"));
        dmlc.setMessageListener(new QueueProcessor());
        dmlc.setConcurrentConsumers(50);
        return dmlc;
    }
}



public class QueueProcessor implements MessageListener {

    public void onMessage(Message message) {

        // process the message
    }
}

В другом отделе происходят восходящие изменения, так что сообщения будут распространяться среди трех разных очередей, названных "high_priority.queue", "med_priority.queue" и "low_priority.queue". Количество одновременных потребителей для каждой очереди должно быть 50, 20 и 5 соответственно.

В моем коде тот же QueueProcessor будет отвечать за обработку сообщений, но я не уверен, как изменить мой конфиг, чтобы создать трех слушателей сообщений, а не один. Любые советы приветствуются.

  • 0
    Правильная вещь, которую нужно сделать для поддержания развязки, - это заставить вышестоящих пользователей использовать очереди для приоритетов, чтобы использовать встроенные приоритеты JMS, тогда вам не придется ничего менять. Нет причин разделять очереди по приоритету.
  • 0
    Я согласен с вашим комментарием, но, к сожалению, я не могу контролировать изменения в основной ветке разработки.
Теги:
spring
activemq
jms

2 ответа

2
Лучший ответ

Я решил эту проблему, просто создав несколько компонентов - не думал, что это будет так просто:

@Bean
public DefaultMessageListenerContainer highPriorityQueue() {
    DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
    dmlc.setConnectionFactory(connectionFactory());
    dmlc.setDestination(new ActiveMQQueue("high_priority.queue"));
    dmlc.setMessageListener(new QueueProcessor());
    dmlc.setConcurrentConsumers(50);
    return dmlc;
}

@Bean
public DefaultMessageListenerContainer medPriorityQueue() {
    DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
    dmlc.setConnectionFactory(connectionFactory());
    dmlc.setDestination(new ActiveMQQueue("med_priority.queue"));
    dmlc.setMessageListener(new QueueProcessor());
    dmlc.setConcurrentConsumers(20);
    return dmlc;
}

@Bean
public DefaultMessageListenerContainer lowPriorityQueue() {
    DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
    dmlc.setConnectionFactory(connectionFactory());
    dmlc.setDestination(new ActiveMQQueue("low_priority.queue"));
    dmlc.setMessageListener(new QueueProcessor());
    dmlc.setConcurrentConsumers(5);
    return dmlc;
}
0

вы можете создать общий класс процессора и установить соединения, адресаты и другие конфигурации этого класса с помощью конструктора, указав имя очереди и подсчеты потребителей как входы кластеров процессоров, которые реализуют этот общий класс. также вы можете объявить конструкторы кладов как бобы для весеннего conf.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню