偷看MSMQ消息后出现额外的Characthers

时间:2012-04-20 15:49:21

标签: python msmq

我正处于升级旧系统的过程中,即使用Biztalk,MSMQ,Java和python。

目前我正在尝试升级项目的某个特定部分,完成后将允许我开始替换许多旧的Legacy系统。

因此,到目前为止,我所做的就是在更新版本的Biztalk(2010)中重新创建Legacy系统,并在一台不在最后阶段的机器上重建。

无论如何,我遇到的问题是,有一段Python代码从MSMQ中获取消息并将其放在另一台服务器上。这个代码自2004年以来一直在我们的遗留系统上实施,从那时起就开始运作,据我所知,从未改变过。

现在,当我重建这个时,我开始在远程服务器中收到错误,在检查了一些问题并消除了许多可能的问题之后,我已经确定错误发生在Python代码从中获取的时候。 MSMQ。

错误示例: 只使用2条消息即可创建错误。请注意,我在这里使用示例XMls,因为实际的很长。

消息一:

<xml>
<field1>Text 1</field1>
<field2>Text 2</field2>
</xml>

消息二:

<xml>
<field1>Text 1</field1>
</xml>

现在,如果我向MSMQ提交消息1,然后是消息2,它们都会在队列中正确显示。如果我然后调用Python脚本消息一个正确返回,但消息2获得额外的字符 post python Message2的例子

<xml>
<field1>Text 1</field1>
</xml>1>Te

我起初可能在Python代码中存在范围问题,但我已经完成了这个问题,并且没有找到,但是我必须承认我第一次认真看待Python代码是这样的项目

Pyhton代码,首先查看消息,然后接收它。当脚本查看时,我能够看到该消息,并且它具有与接收时相同的错误消息。

此错误仅在将较长的消息转换为较短的消息时显示。

我欢迎对可能出错的事情提出任何建议,或者我可以采取哪些措施来确定问题。

我用Google搜索并搜索并疯了一点。这是一个整个项目,因为我们无法开始用这个部件替换旧系统,以充当新的桥梁。

感谢您抽出宝贵时间阅读我的问题

编辑以添加Relevent Python代码 MSMQ.py

import sys

import pythoncom
from win32com.client import gencache
msmq = gencache.EnsureModule('{D7D6E071-DCCD-11D0-AA4B-0060970DEBAE}', 0, 1, 0)

def Peek(queue):
    qi = msmq.MSMQQueueInfo()
    qi.PathName = queue

    myq = qi.Open(msmq.constants.MQ_PEEK_ACCESS,0)
    if myq.IsOpen:
        # Don't loose this pythoncom.Empty thing (it took a while)
        tmp = myq.Peek(pythoncom.Empty, pythoncom.Empty, 1)
    myq.Close()     
    return tmp

这段代码由函数调用。直到周一我才能访问调用此代码的代码。但电话基本上是

msg= MSMQ.peek()

第二次编辑。

我正在附加脚本的前半部分。这基本上是围绕

import base64, xmlrpclib, time
import MSMQ, Config, Logger
import XmlRpcExt,os,whrandom

QueueDetails = Config.InQueueDetails
sleeptime = Config.SleepTime
XMLRPCServer = Config.XMLRPCServer
usingBase64 = Config.base64ing
version=Config.version
verbose=Config.verbose

LogO = Logger.Logger()

def MSMQToIAMS():
        # moved svr cons out of daemon loop
        LogO.LogP(version)
    svr = xmlrpclib.Server(XMLRPCServer, XmlRpcExt.getXmlRpcTransport())
    while 1:
            GotOne = 0
            for qd in QueueDetails:
                    queue, agency, messagetype = qd
                    #LogO.LogD('['+version+"] Searching queue %s for messages"%queue)

                    try:
                            msg=MSMQ.Peek(queue)
                    except Exception,e:
                            LogO.LogE("Peeking at \"%s\" : %s"%(queue, e))
                            continue

                    if msg:
                            try:
                              msg = msg.__call__().encode('utf-8')
                            except:
                              LogO.LogE("Could not convert massege on \"%s\" to a string, leaving it on queue"%queue)
                              continue

                            if verbose:
                              print "++++++++++++++++++++++++++++++++++++++++"
                              print msg
                              print "++++++++++++++++++++++++++++++++++++++++"
                            LogO.LogP("Found Message on \"%s\" : \"%s...\""%(queue, msg[:40]))
                            try:

                                    rv = svr.accept(msg, agency, messagetype)
                                    if rv[0] != "OK":
                                            raise Exception, rv[0]
                                    LogO.LogP('Message has been sent successfully to IAMS from %s'%queue)
                                    MSMQ.Receive(queue)
                                    GotOne = 1
                                    StoreMsg(msg)
                            except Exception, e:
                                    LogO.LogE("%s"%e)

            if GotOne == 0:
                    time.sleep(sleeptime)
            else:
                    gotOne = 0

这是调用MSMQ的完整代码。创建一个监视MSMQ的小程序,当消息到达时,将其拾取并将其发送到另一台服务器。

感谢/

1 个答案:

答案 0 :(得分:0)

听起来真的是Python特有的(我什么都不知道),而不是MSMQ特有的。这不仅仅是一个内存变量被使用两次而没有被清除的情况吗?第二条消息比第一条消息短,因此第一条消息中的字符没有被覆盖。 Python代码的相关部分是什么样的?

<[p> [[4月21日]] 代码只显示您正在使用消息填充tmp变量。访问下一条消息之前tmp会发生什么?我假设它没有被清除。