In this example, we are getting one message from our queue.
import pymqi
qmgr_name = 'QM01'
my_queue = 'COLIN'
qmgr = pymqi.connect(qmgr_name) # connect to the qm
my_q = pymqi.Queue(qmgr, my_queue) # create handle for our queue
data = my_q.get() # get the message off the queue
print(data)
This prints b'Message from Python'.
But what if that was the only message on the queue? Let’s run that code again.
Traceback (most recent call last):
File "get.py", line 7, in <module>
data= q1.get()
File "/u/betacp/pymqi/__init__.py", line 2219, in get
raise MQMIError(rv[-2], rv[-1], QName=self.__QName, message=rv[0], original_length=rv[-3],
pymqi.MQMIError: MQI Error. Comp: 2, Reason 2033: FAILED: MQRC_NO_MSG_AVAILABLE QName=COLIN message= original_length=0 Verb=MQGET
A simple try/except clause can be used to handle an empty queue.
try:
my_q.get()
except pymqi.MQMIError as e:
if e.comp == pymqi.CMQC.MQCC_FAILED and e.reason == pymqi.CMQC.MQRC_NO_MSG_AVAILABLE:
# No messages left to get, this is ok.
continue
else:
# Percolate on any other error code
raise
By default, when you PUT to a queue using PyMQI, the message is a character string.
But by default when you GET this message, you will get a byte string: b'Message from Python!'
We can change this behaviour by defining Message Descriptors and Get-message options.
Start by defining default Message descriptor (MD) and Get-message options objects:
md = pymqi.MD()
gmo = pymqi.GMO()
With these objects, you can do:
# a simple get
q1.get(None)
# specify a Message Descriptor (MD)
q1.get(None, md)
# specify an MD and a Get-message options (GMO)
q1.get(None, md, gmo)
# or a GMO but no MD
q1.get(None, None, gmo)
import pymqi
from pymqi import CMQC, CMQCFC
qmgr_name = 'QM01'
my_queue = 'COLIN'
qmgr = pymqi.connect(qmgr_name) # connect to the Queue Manager
q1 = pymqi.Queue(qmgr, my_queue) # establish Queue handle
gmo = pymqi.GMO()
gmo.Options = pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING| pymqi.CMQC.MQGMO__NO_SYNCPOINT
gmo.WaitInterval = 10 * 1000 # 10 seconds
try:
msg = None
md = pymqi.MD()
# expect empty MD
print("Line 14:", md['PutApplName'])
# msg should be a byte string
msg = q1.get(None, md, gmo)
print("Message:", msg)
# expect MD to now be populated
print("Line 18:", md['PutApplName'])
except pymqi.MQMIError as e:
print(e)
This would produce:
Line 14: b''
Message: b'Message from Python'
Line 18: b'BETACP3 '
After the MQGET request, the returned control blocks are what MQ returned. The above example shows the PutApplName information before and after the MQGET request.