Message browsing with WebSphere MQ and PyMQI
I’ve noticed quite a few people hitting this blog and looking for keywords along the lines of “pymqi read a message and leave on queue” so I thought it should be explained. The thing you’re looking for is called message browsing and this post will show it in action.
Before I get into details though, I’d like to ask you for contacting me if there’s anything I can do regarding the documentation and usage examples. Really, it’s open-source so both the code and docs should shine but I’ll never know what to improve next if you don’t tell me it first Checking the referrers is of course important but it won’t help much if you shun sending me your suggestions. Thanks!
So, the code is below. The trick is composed of two parts that sort of resemble using cursors in SQL databases:
- The queue needs to be open for browsing using the CMQC.MQOO_BROWSE option,
- When calling queue.get, you need to pass it a proper CMQC.MQGMO_BROWSE_* option, in our simple case, there’s only one message on the queue and it just so happens that right after opening the queue for browsing, the logical cursor used for browsing is placed before the first message so we can use CMQC.MQGMO_BROWSE_NEXT and it will browse the next message which happens to be the first and the only one on the queue.
The code has been written in a form of a test case in the hope that it will make it clear that msg1 and msg2 are really equal to self.expected_msg, which is a UUID4 so we know it’s a different message on each test invocation.
I think that would be it as far as explaining the concept goes and again, don’t hesitate to contact me if you’d like me to expand on it or maybe cover something entirely else.
# stdlib import unittest, uuid # PyMQI import CMQC, pymqi queue_manager = "QM01" channel = "SVRCONN.1" host = "192.168.1.139" port = "1434" queue_name = "TEST.1" conn_info = "%s(%s)" % (host, port) class BrowsingTestCase(unittest.TestCase): def setUp(self): self.expected_msg = uuid.uuid4().hex self.qmgr = pymqi.QueueManager(None) self.qmgr.connectTCPClient(queue_manager, pymqi.cd(), channel, conn_info) self.put_queue = pymqi.Queue(self.qmgr, queue_name) self.put_queue.put(self.expected_msg) self.put_queue.close() browse_options = CMQC.MQOO_BROWSE self.browse_queue = pymqi.Queue(self.qmgr, queue_name, browse_options) self.get_queue = pymqi.Queue(self.qmgr, queue_name) def tearDown(self): # Clear the queue and close all objects. try: while True: self.get_queue.get() except pymqi.MQMIError, e: if e.comp != CMQC.MQCC_FAILED and e.reason != CMQC.MQRC_NO_MSG_AVAILABLE: raise self.browse_queue.close() self.get_queue.close() self.qmgr.disconnect() def test_message_browsing(self): md = pymqi.md() gmo = pymqi.gmo() gmo.Options = CMQC.MQGMO_BROWSE_NEXT msg1 = self.browse_queue.get(None, md, gmo) self.assertEquals(msg1, self.expected_msg) msg2 = self.get_queue.get() self.assertEquals(msg2, self.expected_msg)