我正在升级旧系统,即使用 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 的小程序,当消息到达时将其拾取并将其发送到另一台服务器。
谢谢/