Лишние символы появляются после просмотра сообщения MSMQ
Я нахожусь в процессе обновления более старой устаревшей системы, которая использует Biztalk, MSMQ, Java и python.
В настоящее время я пытаюсь обновить конкретную часть проекта, которая по завершении позволит мне начать замену многих устаревших систем на месте.
Таким образом, я до сих пор воссоздаю систему Legacy в более новой версии Biztalk (2010) и на машине, которая не стоит на ногах.
В любом случае, проблема, с которой я столкнулся, заключается в том, что есть фрагмент кода Python, который берет сообщение из MSMQ и помещает его на другой сервер. Этот код действует в нашей прежней системе с 2004 года и работает с тех пор, и, насколько я знаю, никогда не менялся.
Теперь, когда я восстановил это, я начал получать ошибки на удаленном сервере, и после проверки нескольких вещей и устранения многих возможных проблем, я установил, что ошибка возникает где-то в то время, когда код Python берется из MSMQ.
Пример ошибки: ошибка может быть создана с использованием всего 2 сообщений. Пожалуйста, обратите внимание, что я использую примеры XMls здесь, так как фактические довольно длинные.
Сообщение первое:
<xml> <field1>Text 1</field1> <field2>Text 2</field2> </xml>
Сообщение второе:
<xml> <field1>Text 1</field1> </xml>
Теперь, если я отправлю сообщение 1, а затем сообщение 2 в MSMQ, они оба будут правильно отображаться в очереди. Если я затем вызываю скрипт Python, Message возвращается правильно, но сообщение 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 и, когда приходит сообщение, забирает его и отправляет на другой сервер.
Спасибо/
1 ответ
Звучит действительно специфично для Python (о котором я ничего не знаю), а не специфично для MSMQ. Разве это не просто случай, когда переменная памяти используется дважды без промежуточной очистки? Второе сообщение короче первого, поэтому символы из первого не перезаписываются. Как выглядят соответствующие части кода Python?
[[21 апреля]] Код просто показывает, что вы заполняете переменную tmp сообщением. Что происходит с tmp до получения доступа к следующему сообщению? Я предполагаю, что это не очищено.