2017-05-03 110 views
0

我使用spring JMS連接到WSO2MB服務器。一切工作正常,但所有聽衆都分配了相同的ID。爲了使它獨一無二,我提供了clientId,但它不起作用。我沒有找到其他可以提供名稱的領域。在spring jms主題中指定名稱

我甚至在JMS監聽器上提供了id,但沒有成功。

@Bean 
@ConditionalOnProperty(name="my.listener.active", matchIfMissing = true) 
public JmsListenerContainerFactory jmsListenerContainerFactory(@Qualifier("listenerConnectionFactory") ConnectionFactory connectionFactory) throws URLSyntaxException { 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory); 
    factory.setClientId("listener"+listenerTopic); 
    if (Boolean.valueOf(listenerTopic)) { 
     factory.setSubscriptionDurable(true); 
     factory.setPubSubDomain(true); 
    } 
    return factory; 
} 

@JmsListener(destination = "${default-queue-name-to-listen}", id = "${default-queue-name-to-listen}") 
public void receiveMessage(final Message<T> message) throws JMSException { 
} 
+0

您是否需要在應用程序重新啓動後使用相同的ID?這就是問題。如果沒有,你可以添加「偵聽器」+ listenerTopic + System.currentTimeMillis() –

+0

我想爲每個服務使用相同的名稱,所以即使多個實例在運行,它們也會共享相同的名稱。但不同的服務應該有不同的名稱 – krmanish007

回答

0

訂閱名稱進行連接名唯一併解決了我的問題

@JmsListener(
     destination = "${default-queue-name-to-listen}", 
     subscription = "${default-queue-name-to-listen}" 
    ) 
    public void receiveMessage(Message<T> message) throws JMSException {} 
0

每個連接需要有一個獨特的clientID

無效org.apache.activemq.ActiveMQConnectionFactory.setClientID(字符串 clientID的)

設置JMS clientID的使用爲創建連接。 注意,這隻能由一個連接使用一次所以一般 它是一個更好的主意來設置clientID的上一個連接

您的解決方案是使用org.springframework.jms.connection.SingleConnectionFactory

+0

我已經設置clientId:factory.setClientId(「listener」+ listenerTopic); – krmanish007

+0

是的但如果你創建多個連接,這將失敗,但SingleConnectionFactory只創建一個連接,你可以SingleConnectionFactory.setClientId(「listener」+ listenerTopic); –

+0

好吧,我會嘗試,但我不確定它會如何影響,因爲我使用的是docker,並且多個實例仍然會創建其中的一個。目前,我有一些服務器問題,所以一旦解決,我會嘗試這個。謝謝 – krmanish007