gpt4 book ai didi

java - Weblogic JMS 客户端 - 在单个事务中从多个队列读取

转载 作者:行者123 更新时间:2023-11-30 06:02:05 25 4
gpt4 key购买 nike

使用 WebLogic 11g (WebLogic Server 10.3.6.0) 中的 WebLogic JMS 客户端 (wlthin3client.jar) 从单个事务中的多个 JMS 队列读取消息时遇到问题。我试图从队列 Q1 中读取第一条消息,然后,如果该消息满足某些要求,则从队列 Q2 中读取其他消息(如果当时可用)。

我预计提交事务后,这两条消息应该从 Q1 和 Q2 中消失。如果发生回滚 - 消息应保留在 Q1 和 Q2 中。

我的第一个方法是使用异步队列接收器从 Q1 读取,然后在需要时从 Q2 同步读取:

void run() throws JMSException, NamingException {
QueueConnectionFactory cf = (QueueConnectionFactory) ctx.lookup(connectionFactory);

// create connection and session
conn = cf.createQueueConnection();
session = conn.createQueueSession(true, Session.SESSION_TRANSACTED);
Queue q1 = (Queue) ctx.lookup(queue1);

// setup async receiver for Q1
QueueReceiver q1Receiver = session.createReceiver(q1 );
q1Receiver.setMessageListener(this);

conn.start();

// ...
// after messages are processed
conn.close();
}

@Override
public void onMessage(Message q1msg) {
try {
QueueReceiver q2receiver = session.createReceiver(queue2);
if(shouldReadFromQ2(q1msg)){
// synchronous receive from Q2
Message q2msg = q2receiver.receiveNoWait();
process(q2msg);
}
session.commit();
} catch (JMSException e) {
e.printStackTrace();
} finally {
q2receiver.close();
}
}

不幸的是,即使我发出 session.commit(),来自 Q1 的消息仍然未提交。它处于接收状态,直到连接或接收器关闭。然后,当它进入延迟状态时,它似乎会回滚。

其他观察结果:

  1. 如果 Q2 为空并且没有任何内容可供读取,则 Q1 消息已正确提交。
  2. 当我以类似的嵌套方式对 Q1 和 Q2 使用同步 API 时,不会出现此问题。因此,如果我使用 q1Receiver.receiveNoWait() 一切都很好。
  3. 如果我以类似的嵌套方式对 Q1 和 Q2 使用异步 API,则仅调用 Q1 消息监听器并且提交适用于 Q1。但是 Q2 消息监听器根本没有被调用,并且 Q2 没有提交(消息停留在 receive/delayed 状态)。

我是否以某种方式滥用了 API?或者这是 WLS JMS 错误?如何将多个队列的读取与异步 API 结合起来?

最佳答案

事实证明这是一个 WLS JMS bug 28637420 。bug 状态表明它已修复,但我不会依赖于此 - 具有此修复功能的 WLS 11g 补丁不起作用(请参阅 bug 29177370 )。

Oracle 表示,发生这种情况是因为两种不同的传递机制(同步消息与异步消息)未设计为在同一 session 上协同工作。

解决该问题的最简单方法是在需要在单个 session 中处理多个队列的情况下使用同步 API(轮询)。我决定采用这种方法。

oracle 建议的另一个选项是将 UserTransactions 与两个不同的 session 一起使用,一个 session 用于异步使用者,另一个 session 用于同步使用者。不过我没有测试过。

关于java - Weblogic JMS 客户端 - 在单个事务中从多个队列读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042316/

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