我正处于升级旧系统的过程中,即使用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的小程序,当消息到达时,将其拾取并将其发送到另一台服务器。
感谢/
答案 0 :(得分:0)
听起来真的是Python特有的(我什么都不知道),而不是MSMQ特有的。这不仅仅是一个内存变量被使用两次而没有被清除的情况吗?第二条消息比第一条消息短,因此第一条消息中的字符没有被覆盖。 Python代码的相关部分是什么样的?
<[p> [[4月21日]] 代码只显示您正在使用消息填充tmp变量。访问下一条消息之前tmp会发生什么?我假设它没有被清除。