Biztalk、MSMQ、Java、およびPythonを使用している古いレガシーシステムをアップグレードするプロセスに入っています。余分な文字がMSMQメッセージで覗き見て表示される
現在、私はプロジェクトの特定の部分をアップグレードしようとしています。完了すると、多くのhte Legacyシステムの置き換えを開始することができます。
これまで行ってきたことは、Biztalk(2010)の新しいバージョンとその最後の足ではないマシンでレガシーシステムを再作成することです。
とにかく、私が抱えている問題は、MSMQからメッセージをピックアップして別のサーバーに配置するPythonコードがあることです。このコードは2004年以来、私たちのレガシーシステム上に実装されており、それ以来、私の知る限り変更されていません。
これを再構築すると、リモートサーバーでエラーが発生し、いくつかの問題をチェックして、考えられる多くの問題を解決した後、私はPythonコードがピックアップされている時間MSMQ。
エラーの例: エラーは、わずか2つのメッセージを使用して作成できます。実際のものはかなり長いので、ここではサンプルXMlsを使用しています。
メッセージ1:
<xml> <field1>Text 1</field1> <field2>Text 2</field2> </xml>
メッセージ2:今すぐ
<xml> <field1>Text 1</field1> </xml>
私はメッセージ1提出する場合は、メッセージ2に続いては、MSMQに彼らは両方のキューに正しく表示されます。私は、Pythonのコード内で最初にあったかもしれないscoping問題にかかわらず、Pythonスクリプトのいずれかが正しく返されるメッセージが、メッセージ2人の利益の余分な文字ポストパイソンの 例メッセージ2
<xml>
<field1>Text 1</field1>
</xml>1>Te
Iを呼び出すが、私は持っているIf私はできるだけでなくそれを通り抜けましたが、誰も見つけられませんでした。しかし、私はPythonコードを真剣に見たのはこのプロジェクトでした。
Pythtonコードは、最初にメッセージを覗いて受信します。私は、スクリプトが覗いているときにメッセージを見ることができましたし、それが受け入れるときと同じエラーメッセージを持っています。
また、このエラーは、より長いメッセージを短いメッセージに変換する場合にのみ表示されます。
私は間違っている可能性のあることや、問題を特定するためにできることを歓迎します。
私はグーグルで検索し、少し狂った。これはプロジェクト全体を保持しています。古いシステムを新しいブリッジとして機能させるためにこの部分で置き換えることはできません。 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()
第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を監視する小さなプログラムを作成し、メッセージが到着したときにそれを取り出して別のサーバーに送信します。
感謝/
関連するコードをいくつか追加しました。 – Gareth
これを投稿した後、私はおそらくメッセージをつかむために別の言語のプログラムを書いて、どう見ているのかを見てみるべきです。月曜日にそれを行って、問題を1つの要因に分離する必要があります。 – Gareth
John、ごめんなさいあなたの編集された答えを逃しました。私はtmp変数を単一の文字長文字列に設定するコードを追加しようとしましたが、問題は残ります。私はまた、問題なしでC#でこれを実装しました。だから私は離れて移動している言語であるPyhtonに頼らずにサーバーコールをしようとしています。しかし、助けてくれてありがとう。 – Gareth