您的位置:首页 > 其它

MQ是怎么存放消息的[windows平台]

2010-07-15 13:58 267 查看
今天突然想看看MQ到底是怎么存放消息的,首先想到的是存放在数据库中,我在安装开发环境时创建了一个DB2的数据库实例BRKDB1,数据库用户是db2admin,

于是我就在BRKDB1中查看db2admin用户下所有的表,但是既没有看见队列中的消息,也没有看见队列信息。

接下来我就去注册表中寻找,但是在IBM键下只找到了代理名BROKER1、队列管理器的名称BROKER1_QUEUE_MANAGER以及系统默认创建的那些*SYSTEM*队列,并没有找到我在开发过程中自己创建的队列。

那么只有可能是存放在磁盘文件中了,果然在C:/Program Files/IBM/WebSphere MQ/Qmgrs/BROKER1_QUEUE_MANAGER/queues目录下看到了所有的队列,每个队列目录下还有个Q文件,看来每个队列的Q文件就是用于存放该队列中的消息的。这时就体现出持久性和非持久性的区别了,非持久性队列中的消息是不会写入这个Q文件的,里面的消息会一直存放在缓存中,所以MQ重启后,非持久性队列中的所有消息都会丢失。 只有持久性队列中的消息才会写入Q文件中,但是并不是马上写入,开始时也是存在缓存中,过一会时间才会写入Q文件,如果MQ重启的话,会在重启之前把消息都写入Q文件。

但是队列的持久属性是可以改变的,要是某个队列原本是持久性的,后来又改成了非持久性,原来保存的消息在重启MQ后会不会丢失呢?答案是不会丢失。

------------------------------------------------------------------------------------------

别名队列:别名队列有一个属性是基本队列,别名队列可以看做一个指向基本队列的指针。比如有个别名队列ZL.QM.LOG.BK,它的基本队列是ZL.QM.LOG,那么在ZL.QM.LOG.BK上读写消息实际上就是对ZL.QM.LOG读写消息。别名队列下面也一样有个Q文件,不过这个文件是不会存放消息的。但是别名队列和基本队列都可以指定是否是持久性,如果他们有一个是持久性的而另一个不是的话会怎么样?

(1)别名队列持久性,基本队列非持久性:只要是放入这个别名队列的消息,都会保存在相应基本队列的Q文件中,而直接放入基本队列的消息不会保存在Q文件中,也就是说MQ重启之后,直接放入基本队列的消息会丢失,但是通过别名队列放入的消息不会丢失。

(2)别名队列非持久性,基本队列持久性:放入这个别名队列的消息,不会保存到Q文件中,而直接放入基本队列的消息会保存在Q文件中,也就是说MQ重启之后,直接放入基本队列的消息不会丢失,但是通过别名队列放入的消息会丢失。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: