在启用虚拟使用者的情况下从java启动ActiveMQ(虚拟消费者无法正常工作)

时间:2017-08-06 09:51:06

标签: java activemq

我试图从启用虚拟目的地的java启动ActiveMQ,但我认为配置错误。

public static void main(String[] args) throws Exception {
    // Virtual Destination Interceptor
    VirtualTopic virtualTopic = new VirtualTopic();
    virtualTopic.setName("VirtualTopic.>");
    virtualTopic.setPrefix("Consumer.*.");
    VirtualDestinationInterceptor virtualDestinationInterceptor = new VirtualDestinationInterceptor();
    virtualDestinationInterceptor.setVirtualDestinations(new VirtualDestination[] {virtualTopic});

    // Create and Start the Broker
    BrokerService broker = new BrokerService();
    broker.setDestinationInterceptors(new DestinationInterceptor[] {virtualDestinationInterceptor});
    broker.addConnector("tcp://localhost:61616");
    broker.start();
}

以上内容应启用虚拟目的地,并允许我发送主题 VirtualTopic.myTopicName 并从 Consumer.A.VirtualTopic.myTopicName 接收。 (注意,这取代了我没有的 activemq.xml 。)


从我的代码中我发送:

jmsTopicTemplate.send("VirtualTopic.myTopicName", session -> session.createTextMessage(jmsEvent));

接收:

@JmsListener(destination = "Consumer.A.VirtualTopic.myTopicName", containerFactory = "jmsTopicListenerContainerFactory")

但我没有收到消息。

通过jconsole,我看到该消息已排入 VirtualTopic.myTopicName ,但 Consumer.A.VirtualTopic.myTopicName 的排队数为0。

如果将 @JmsListener 更改为:

@JmsListener(destination = "VirtualTopic.myTopicName", containerFactory = "jmsTopicListenerContainerFactory")

然后我收到了5条消息(因为我有5位消费者)。


有人有任何建议吗? 这听起来像是一个配置问题。



为了完整性,这些是我的 jmsTopicTemplate jmsTopicListenerContainerFactory

@Bean
public JmsTemplate jmsTopicTemplate(@Qualifier("activeMQConnectionFactory") ConnectionFactory connectionFactory) {
    JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
    jmsTemplate.setPubSubDomain(true);
    return jmsTemplate;
}

@Bean
public JmsListenerContainerFactory jmsTopicListenerContainerFactory(@Qualifier("activeMQConnectionFactory") ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setConcurrency("4-5");
    factory.setPubSubDomain(true);
    return factory;
}

1 个答案:

答案 0 :(得分:2)

哦!我收到了错误。

错误发生在 @JmsListenerContainerFactory 中:

它不应该再从主题中听,因为虚拟目标实际上是队列。我需要删除 factory.setPubSubDomain(true); ,并使用以下内容。

@Bean
public JmsListenerContainerFactory jmsTopicListenerContainerFactory(@Qualifier("activeMQConnectionFactory") ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setConcurrency("4-5");
    return factory;
}



此外,ActiveMQ文档说默认情况下虚拟目的地是活动的,它是真的。

因此,启动ActiveMQ的代码可以简化为:

public static void main(String[] args) throws Exception {
    BrokerService broker = new BrokerService();
    broker.addConnector("tcp://localhost:61616");
    broker.start();
}