我正在嘗試編寫一個基本的 ActiveMQ 客戶端來收聽一個主題。我正在使用 Spring Boot ActiveMQ。我有一個基于使用 DefaultJmsListenerContainerFactory 的各種教程構建的實現,但我在使其正常工作時遇到了一些問題。@Configuration@EnableJmspublic 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 并且似乎很高興使用持久消費者(但它有自己的不同問題)。無論如何,我不認為這是缺乏對另一端持久連接的支持。我希望在這方面有更多經驗的人可以幫助我弄清楚這個錯誤是否是我可以忽略的,或者我需要做些什么來解決它。
1 回答

慕田峪4524236
TA貢獻1875條經驗 獲得超5個贊
JMS 1.1(這是您使用的,因為您使用的是 ActiveMQ 5.x)不支持共享持久訂閱。因此,當您使用setConcurrency("3-10")
并且 Spring 嘗試創建 > 1 個訂閱時,您會收到一個錯誤。我看到解決這個問題的兩種主要方法:
使用
setConcurrency("1")
它將訂閱者/消費者的數量限制為 1。根據您的要求,這可能會對性能產生嚴重的負面影響。切換到支持JMS 2.0的ActiveMQ Artemis并調用.
setSubscriptionShared(true)
添加回答
舉報
0/150
提交
取消