關於爲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:聽衆配置消費者名稱?