2013-02-18 209 views
1

關於爲OracleAQ在Spring以下配置JMS:偵聽OracleAQ

<jms:listener-container connection-factory="connectionFactory" 
    client-id="LUKAS34" 
    message-converter="messageConverter" 
    container-class="org.springframework.data.jdbc.jms.listener.oracle.AdtMessageListenerContainer" 
    destination-type="topic"> 
    <jms:listener destination="AQ_TS_MY_TEST" 
     ref="messageDelegate" method="handleMessage" subscription="LUKAS34" /> 
</jms:listener-container> 

這裏的問題是,儘管我們沒有訂閱LUKAS34(但我們還有其他的 - LUKAS)以上配置的原因來自AQ_TS_MY_TEST的所有消息都被讀取。

我希望如果我定義subscription="LUKAS"這個訂閱的所有消息都會被讀取,否則不會被讀取。

上述配置有什麼問題?

此外,我看到,在表:

select * 
from ALL_QUEUE_SUBSCRIBERS; 

是許多條目,如「TSUB_1_ *」,這在我看來,春天配置,配置跳過「創造」新的消費者和名稱「LUKAS」。

好的......我修改了(這不是一個解決方案,但它顯示了問題出在哪裏......)一些春季班。讓我們來看看私有方法... org.springframework.jms.listener.DefaultMessageLis tenerContainer#initResourcesIfNecessary

private void initResourcesIfNecessary() throws JMSException { 
     if (getCacheLevel() <= CACHE_CONNECTION) { 
      updateRecoveryMarker(); 
     } 
     else { 
      if (this.session == null && getCacheLevel() >= CACHE_SESSION) { 
       updateRecoveryMarker(); 
       this.session = createSession(getSharedConnection()); 
      } 
      if (this.consumer == null && getCacheLevel() >= CACHE_CONSUMER) { 
       this.consumer = createListenerConsumer(this.session); 
       synchronized (lifecycleMonitor) { 
        registeredWithDestination++; 
       } 
      } 
     } 
    } 

如果我改變這裏(從隨機生成的這個方法的消費者名稱(如我想通過隨機生成的春天)到我的固定名稱'LUKAS'一切都按我的預期工作 - 我的聽衆只讀取PL/SQL端爲消費者'LUKAS'定義的消息。

所以問題是如果我可以在某種情況下設置jms:聽衆配置消費者名稱?

回答

1

嘗試更改您的

destination-type="topic" 

到:

destination-type="durableTopic" 

,看是否工程。