0

我正在使用 weblogic 10.3 。我正在尝试使用由 jdbc 存储(在 Oracle DB 中)支持的持久消息配置持久订阅。我有一个 MDB 作为持久订阅者正在监听的主题。在方案 1 下:如果我发送消息,它会到达 MDB。

在场景 2 下:我暂停 MDB,希望发送到主题的消息只要不被 MDB(它是唯一注册的持久订阅者)消耗,就会一直存在。但是当我确实将消息发送到主题时,它会短暂显示在那里然后消失(我使用 HermesJMS 看到它)。

我的印象是,在这种情况下,由于消息没有被 MDB 使用,它们将被记录到 JDBC 存储中,但是 oracle db 中的 WLSTORE 表也没有得到任何持久化的消息。

后来我发现消息确实显示在主题 > 持久订阅者 > 在管理控制台中显示消息中。

因此,显然发生的事情是主题不保留消息,但在其下注册的持久订阅会保留它,直到消息被消费。

问题-1)但是消息不去基于Oracle的jdbc存储的事实仍然没有意义吗?我在这里做错了什么?

问题-2)即使我确实恢复MDB以开始侦听消息,该主题仍会在持久订阅者(在管理控制台中)下显示所有消息仍然完好无损-我希望它们在处理后会从那里删除由唯一注册的持久订户。

4

2 回答 2

1

消息不会出现在主题中,因为主题和队列是不同的通信模型。假设您有一个具有 2 个(持久)订阅者的持久主题:A 和 B。您希望他们都收到消息。为确保这一点,A 和 B 都必须确认他们收到了消息。这也是您重新传递所有消息的原因,重新连接后,您的 MDB 必须在消息上调用 commit(),以告诉服务器它已完成处理。这也解释了为什么主题本身不存储消息,它们是按持久消费者存储的。因为 A 可能会提交消息,但 B 不会(可能“离线”)。因此,您需要为每个消费者提供一份副本。

于 2013-01-24T12:32:18.573 回答
0

我在进一步的测试中发现了一些有趣的东西——

对于问题 1) _ 即使我没有在 weblogic 10 中为 JMS 服务器配置 jdbc 存储,它也有自己的默认文件存储,无需任何配置即可始终运行。此文件存储用于存储持久订阅的持久消息,并且即使在服务器重新启动时,该存储也会保留消息。

如需更多阅读 - http://docs.oracle.com/cd/E17904_01/web.1111/e13701/store.htm#i1130575

对于问题 2)_ 我的 MDB 期待某种格式的 XML 消息,在我的测试过程中为了简单起见,我开始发送小文本消息并且忘记了它们不会在 MDB 中成功处理。所以 MDB 在所有这些消息上都失败了,并且回滚了事务,这就是为什么当我恢复 MDB 时消息永远不会被删除的原因。

这几乎回答了我的两个问题。

于 2013-01-24T19:48:24.703 回答