jms:OracleAQ的监听器

时间:2013-02-18 14:25:20

标签: java spring jms spring-jms oracle-aq

关于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;

是很多条目,例如&#39; TSUB_1 _ *&#39;在我看来,春天的配置创造了&#39;新消费者和名字&#39; LUKAS&#39;在配置中被跳过。

好的......我修改了(它不是一个解决方案,但它显示问题出在哪里......)一些春季课程。让我们来看看私有方法...... 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++;
                }
            }
        }
    } 

如果我在这里改变(在这个方法中,消费者名称从随机生成的(因为我认为由spring随机生成)到我的固定名称&#39; LUKAS&#39;一切都按照我的预期工作 - 我的听众只读取那些消息在PL / SQL方面为消费者&LUKAS&#39;。

定义

所以问题是我是否可以以某种方式在spring jms中设置:listener配置使用者名称?

1 个答案:

答案 0 :(得分:1)

尝试更改

destination-type="topic"

为:

destination-type="durableTopic"

看看是否有效。