我正在尝试编写一个基本的 ActiveMQ 客户端来收听一个主题。我正在使用 Spring Boot ActiveMQ。我有一个基于使用 DefaultJmsListenerContainerFactory 的各种教程构建的实现,但我在使其正常工作时遇到了一些问题。
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public DefaultJmsListenerContainerFactory jmsContainerFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConcurrency("3-10");
factory.setConnectionFactory(connectionFactory);
configurer.configure(factory, connectionFactory);
factory.setSubscriptionDurable(true);
factory.setClientId("someUniqueClientId");
return factory;
}
}
@JmsListener(destination="someTopic", containerFactory="jmsContainerFactory", subscription="someUniqueSubscription")
public void onMessage(String msg) {
...
}
一切正常,直到我尝试进行持久订阅。当我这样做时,我发现在容器工厂上设置了客户端 ID 时,我收到有关无法在共享连接上设置客户端 ID 的错误。
Cause: setClientID call not supported on proxy for shared Connection. Set the 'clientId' property on the SingleConnectionFactory instead.
当我更改代码以在连接工厂上设置客户端 ID(它是一个包装 ActiveMQConnectionFactory 的 CachingConnectionFactory)时,服务成功启动,读取几条消息,然后开始持续输出此错误:
Setup of JMS message listener invoker failed for destination 'someTopic' - trying to recover. Cause: Durable consumer is in use for client: someUniqueClientId and subscriptionName: someUniqueSubscription
我继续收到消息,但这个错误也混杂在日志中。这似乎是一个问题,但我真的不清楚如何解决它。
我确实有一个没有任何 spring 代码的天真实现,直接使用 ActiveMQConnectionFactory 并且似乎很高兴使用持久消费者(但它有自己的不同问题)。无论如何,我不认为这是缺乏对另一端持久连接的支持。
我希望在这方面有更多经验的人可以帮助我弄清楚这个错误是否是我可以忽略的,或者我需要做些什么来解决它。
慕田峪4524236
相关分类