通过相同的ActiveMQConnectionFactory消耗多个ActiveMQ队列

时间:2014-09-09 10:59:06

标签: java spring jms activemq

我的应用程序处理放置在单个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将负责处理消息,但我不确定如何修改我的配置来创建三个消息监听器而不是一个。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

我通过简单地创建多个bean来解决这个问题 - 没想到会这么容易:

@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;
}

答案 1 :(得分:0)

您可以创建一个通用处理器类,并使用构造函数在此类上设置连接,目标和其他配置,方法是将队列名称和使用者计数作为处理器clases的输入,这些处理器clases是通过此泛型类实现的。你也可以将这个clases构造函数声明为spring conf。

的bean