1

Springでの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_*」のような多くのエントリです。これは、Spring 構成が新しいコンシューマーを「作成」し、構成で「LUKAS」という名前がスキップされるように思われます。

わかりました...変更しました(解決策ではありませんが、問題がどこにあるかを示しています...)いくつかの春のクラス。プライベートメソッドを見てみましょう... org.springframework.jms.listener.DefaultMessageListenerContainer#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++;
                }
            }
        }
    } 

ここで(このメソッドでは、消費者名をランダムに生成されたもの(Springによってランダムに生成されたと思われる)から固定名「LUKAS」に変更すると、すべてが期待どおりに機能します-リスナーはPL / SQL側で定義されたメッセージのみを読み取りますコンシューマー「LUKAS」。

問題は、どうにかして春の jms:listener 構成の消費者名を設定できるかどうかです。

4

1 に答える 1

1

変更してみてください

destination-type="topic"

に:

destination-type="durableTopic"

そして、それが機能するかどうかを確認します。

于 2013-07-23T11:44:06.383 に答える