【问题标题】:JMS durable subscriber persistent messages don't persist to the databaseJMS 持久订阅者持久消息不会持久保存到数据库
【发布时间】:2013-01-23 21:49:30
【问题描述】:

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

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

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

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

所以很明显,主题并没有保留消息,但是在它下面注册的持久订阅会保留它,直到消息被消费为止。

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

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

【问题讨论】:

    标签: jms weblogic persistent


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 1970-01-01
        • 2013-12-17
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 2017-01-24
        • 1970-01-01
        相关资源
        最近更新 更多