Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 偷看MSMQ消息后显示的额外字符_Python_Msmq - Fatal编程技术网

Python 偷看MSMQ消息后显示的额外字符

Python 偷看MSMQ消息后显示的额外字符,python,msmq,Python,Msmq,我正在升级一个旧的遗留系统,即使用Biztalk、MSMQ、Java和python 目前,我正在尝试升级项目的一个特定部分,完成后将允许我开始替换许多遗留系统 因此,到目前为止,我所做的工作是在更新版本的Biztalk(2010)中,在一台不处于最后阶段的机器上重新创建遗留系统 无论如何,我遇到的问题是,有一段Python代码从MSMQ中提取消息并将其放在另一台服务器上。这段代码自2004年以来一直在我们的遗留系统中使用,并且从那时起一直有效,据我所知从未更改过 现在,当我重新构建它时,我开始在

我正在升级一个旧的遗留系统,即使用Biztalk、MSMQ、Java和python

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

因此,到目前为止,我所做的工作是在更新版本的Biztalk(2010)中,在一台不处于最后阶段的机器上重新创建遗留系统

无论如何,我遇到的问题是,有一段Python代码从MSMQ中提取消息并将其放在另一台服务器上。这段代码自2004年以来一直在我们的遗留系统中使用,并且从那时起一直有效,据我所知从未更改过

现在,当我重新构建它时,我开始在远程服务器中发现错误,在检查了一些东西并排除了许多可能的问题之后,我确定错误发生在Python代码从MSMQ中提取时的某个时间

错误示例: 仅使用2条消息即可创建错误。请注意,我在这里使用的是示例XML,因为实际的XML非常长

信息一:

这段代码由函数调用。直到星期一我才有权使用调用这个的代码。但这个电话是基本的

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的小程序,当消息到达时,它会将消息拾取并发送到另一台服务器


谢谢/

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

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

在发布这篇文章后,我注意到,我可能应该用另一种语言编写一个程序来获取消息并查看它的外观,尽管这一天做得有点晚。我将在周一尝试一下,因为这将把问题隔离到一个单一的因素上。约翰,对不起,错过了你编辑过的答案。我尝试添加一段代码,将tmp变量设置为单字符长度的字符串,但问题仍然存在。我也在C#中实现了这一点,没有这个问题。因此,我尝试在不使用Pyhton的情况下进行服务器调用,Pyhton是一种我们正在远离的语言。谢谢你的帮助。
<xml>
<field1>Text 1</field1>
</xml>1>Te
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