我试图从启用虚拟目的地的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;
}
答案 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();
}