JMS持久订户持久消息不';不能持久保存到数据库

JMS持久订户持久消息不';不能持久保存到数据库,jms,weblogic,persistent,Jms,Weblogic,Persistent,我使用的是WebLogic10.3。 我正在尝试配置一个持久订阅,该订阅包含由jdbc存储(在Oracle DB中)支持的持久消息。我有一个主题,MDB正在作为持久订阅者收听。 在场景1下:如果我发送消息,它将命中MDB 在场景2下:我挂起MDB,希望发送到主题的消息不会被MDB(它是唯一注册的持久订阅者)占用,就不会被占用。但当我将信息发送到主题时,它会在那里短暂显示,然后消失(我使用HermesJMS看到它) 我的印象是,由于MDB没有使用这些消息,因此在本例中它们将被登录到JDBC存储中,

我使用的是WebLogic10.3。 我正在尝试配置一个持久订阅,该订阅包含由jdbc存储(在Oracle DB中)支持的持久消息。我有一个主题,MDB正在作为持久订阅者收听。 在场景1下:如果我发送消息,它将命中MDB

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

我的印象是,由于MDB没有使用这些消息,因此在本例中它们将被登录到JDBC存储中,但oracle db中的WLSTORE表也不会在其中保存任何消息

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

显然,topic并没有保留消息,但是在它下面注册的持久订阅会保留消息,直到消息被消费为止

问题-1)但消息不会发送到基于Oracle的jdbc存储区这一事实仍然没有意义?我做错了什么


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

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

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

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

更多阅读-

对于问题2)\我的MDB需要某种格式的XML消息,为了简化测试,我开始发送小文本消息,但忘记了它们在MDB中无法成功处理。因此,MDB在所有这些消息上都失败了,并回滚了事务,这就是为什么在我恢复MDB时消息从未被删除的原因

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