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 端定义的消息消费者“卢卡斯”。

所以问题是我是否可以在 spring jms:listener configuration consumer name 中以某种方式设置?

4

1 回答 1

1

尝试改变你的

destination-type="topic"

至:

destination-type="durableTopic"

看看这是否有效。

于 2013-07-23T11:44:06.383 回答