gpt4 book ai didi

java - jms:OracleAQ 的监听器

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:17 26 4
gpt4 key购买 nike

关于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”被跳过。

好吧...我修改了(这不是解决方案,但它显示了问题所在...)一些 spring 类。让我们看一下私有(private)方法... 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 随机生成)到我的固定名称“LUKAS”,一切都会按我的预期工作 - 我的监听器仅读取在 PL/SQL 端为消费者“LUKAS”定义的那些消息。

所以问题是我是否可以在 spring jms:listener 配置消费者名称中设置?

最佳答案

尝试改变你的

destination-type="topic"

至:

destination-type="durableTopic"

看看这是否有效。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com