Hi everyone,

Could someone help explain what I am doing wrong in
this code block?

This code block is an excerpt from a larger file that receives
transmitted files via IBM WebSphere MQSeries an drops it to the local
file system.

Transmission of the file works as designed but it has a flaw.

If the file cannot be created for whatever reason, the transmitted
message is lost.

What I am trying to do is ensure that a file transmit is considered
successful only after the created file's checksum matches.

If not, the code should treat it as an error and roll back the message
to MQSeries without a commit.

The basis for this should be around the pymqi.QueueManager class which
is named mq in the block listed below.

On execution, I get the traceback of:

Traceback (most recent call last):
  File "M:\MQ\MQ\Scripts\receiver.py", line 269, in ?
    receiver.run()
  File "M:\MQ\MQ\Scripts\receiver.py", line 109, in run
    self.connect()
  File "M:\MQ\MQ\Scripts\receiver.py", line 118, in connect
    self.qm.begin()
  File "c:\python24\lib\site-packages\pymqi.py", line 738, in begin
    raise MQMIError(rv[0], rv[1])
pymqi.MQMIError: MQI Error. Comp: 1, Reason 2121: WARNING:
MQRC_NO_EXTERNAL_PARTICIPANTS



Do you have any idea why this might be occurring?


class Receiver(object):
    def __init__(self,qm_name,queue_name):
        self.qm_name = qm_name
        self.queue_name = queue_name

        # Will be set later
        self.qm = None
        self.message = None

    def run(self):
        self.connect()
        self.get()

    def connect(self):
        """
        Connect to queue manager
        """
        try:
            self.qm = mq.QueueManager(options.qmanager.upper() )
            self.qm.begin()
        except mq.PYIFError, err:
            mqevlog.event("error",err)
            sys.exit(1)


    def get(self):
        """
        Get a message from queue.
        """
        queue = mq.Queue(self.qm, self.queue_name)
        pmo = mq.pmo(Options = CMQC.MQPMO_SYNCPOINT)
        md = mq.md()



        while True:
                try:
                        var = queue.get(self.message, md, pmo )
                except mq.MQMIError,e:
                        if e.reason != CMQC.MQRC_NO_MSG_AVAILABLE:
                                mqevlog.event("error",e)
                                sys.exit(1)
                        break
                else:
                        buff = StringIO(var)
                        tree = ElementTree(file=buff)

                        # Extract required elements and assign to local 
variables
                        key           = "this should be a well-kept secret"
                        file_name     = tree.find("dest").text
                        creation_time = tree.find("creation_time").text
                        contents      = tree.find("contents").text
                        check         = tree.find("checksum").text


                        #Decode temp file
                        original = file_encoder.decode(contents)


                        # Drop file to disk
                        if  os.path.exists(file_name) is False:
                                open(file_name,"wb").write(original)
                        else:
                                mqevlog.event(sys.argv[0],"error","Output file 
path/name already
exists")
                                sys.exit(1)

                        # Get checksum of newly created file
                        sum=csums.getsum(file_name)

                        # Compare checksum of created file with value 
transmitted
                        if 
csums.checksum_compare(sys.argv[0],sum,check,file_name) == True:
                                queue.commit()
                                sys.exit(0)
                        else:
                                queue.backout()
                                mqevlog.event("error","CheckSums of
received/transmitted files do not match")
                                sys.exit(1)



Any help/insight you can provide on this would be greatly appreciated.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to