2013-01-23 106 views
0

我正在使用weblogic 10.3。 我试图配置一个持久的消息,由jdbc存储支持(在Oracle数据库中)的持久订阅。我有一个MDB正在倾听的主题是持久订阅者。 在情景-1下:如果我发送消息,它会击中MDB。JMS持久订阅者持久性消息不会持久存在数据库中

在情景-2下:我暂停了MDB,希望邮件发送到主题时只要它们不被MDB(这是唯一注册的持久订阅者)所使用,就会停留在周围。但是当我将消息发送给主题时,它会在那里简要显示,然后消失(我使用HermesJMS来看它)。

我的印象是,由于MDB没有使用这些消息,因此在这种情况下会记录到JDBC存储中,但是oracle db中的WLSTORE表并没有得到任何消息。

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

因此,显然发生了什么事情是主题不保留消息,而是在其下面注册的持久订阅保留它,直到消息消耗完。

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

问题-2)即使当我恢复MDB开始侦听邮件时,该主题仍然显示持久订阅者(管理控制台)下的所有邮件仍然完好无损 - 我希望他们会从那里移除因为他们被唯一注册的耐用用户处理。

回答

1

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

0

我发现一对夫妇在进一步测试有趣的事情 -

问题1)_即使我没有在WebLogic 10配置JDBC存储的JMS服务器,它有自己的默认文件存储其中始终工作,没有任何配置。该文件存储用于存储持久订阅的持久性消息,并且该存储将在整个服务器重新启动时保留消息。

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

问题2)_我的MDB期待在某些格式的XML消息,我的测试过程中让事情变得简单,我开始向小短信和忘记,他们将不会得到处理成功地在MDB中。因此MDB无法处理所有这些消息,并且回滚事务,这就是为什么当我恢复MDB时消息永远不会被删除。

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