0

我正在升级旧系统,即使用 Biztalk、MSMQs、Java 和 python。

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

因此,到目前为止,我所做的是在较新版本的 Biztalk (2010) 和尚未结束的机器上重新创建 Legacy 系统。

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

现在,当我重建它时,我开始在远程服务器中遇到错误,在检查了一些事情并消除了许多可能的问题之后,我确定错误发生在 Python 代码从 MSMQ 获取的时间附近。

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

留言一:

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

留言二:

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

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

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

我虽然起初可能在 Python 代码中存在范围界定问题,但我已经尽可能地解决了这个问题,但没有发现任何问题,但是我必须承认,我第一次认真研究 Python 代码是这个项目。

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

此外,此错误仅在将较长消息转换为较短消息时才会出现。

我欢迎任何关于可能错误的事情的建议,或者我可以做些什么来确定问题。

我用谷歌搜索和搜索,有点疯狂。这阻碍了整个项目,因为我们不能开始用这块替换旧系统来充当新的桥梁。

感谢您花时间阅读我的问题

编辑以添加相关 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()

第 2 次编辑。

我附上脚本的前半部分。这基本上是循环的

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

谢谢/

4

1 回答 1

0

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

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

于 2012-04-20T18:20:33.103 回答