关于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.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”。

所以问题是,是否可以在spring jms:listener配置使用者名称中设置?

最佳答案

尝试改变你的

destination-type="topic"


至:

destination-type="durableTopic"


看看是否可行。

关于java - jms:OracleAQ监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14938549/

10-10 02:22