JMS持久订阅者持久性消息不会持久存储到数据库

时间:2013-01-23 21:49:30

标签: jms weblogic persistent

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

在方案-2下:我暂停MDB,希望发送到主题的消息将保持不变,只要它们不被MDB(这是唯一注册的持久订阅者)消耗掉。但是当我将消息发送到主题时,它会在那里短暂显示然后消失(我使用HermesJMS看到它)。

我的印象是,由于它们没有被MDB使用,因此在这种情况下会将消息记录到JDBC存储中,但是oracle db中的WLSTORE表也不会在其中保留任何消息。

我后来发现这些消息确实出现在主题>持久用户>在管理控制台中显示消息。

所以正在发生的事情是主题不会保留消息,但是在其下注册的持久订阅会保留消息,直到消息消失为止。

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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时消息永远不会被删除的原因。

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