0

Biztalk、MSMQ、Java、および Python を使用している古いレガシ システムをアップグレード中です。

現在、プロジェクトの特定の部分をアップグレードしようとしています。これが完了すると、多くのレガシー システムのインプレース交換を開始できるようになります。

そのため、私がこれまでに行ったことは、Biztalk (2010) の新しいバージョンと、最後の脚にないマシンでレガシー システムを再作成することです。

とにかく、私が抱えている問題は、MSMQ からメッセージを取得して別のサーバーに配置する Python コードがあることです。このコードは 2004 年からレガシー システムに配置され、それ以来機能しており、私の知る限り、変更されたことはありません。

これを再構築すると、リモート サーバーでエラーが発生し始めました。いくつかのことを確認し、考えられる多くの問題を取り除いた後、Python コードが MSMQ から取得しているときにエラーが発生することがわかりました。

エラーの例: たった 2 つのメッセージを使用してエラーを作成できます。実際の XML はかなり長いので、ここではサンプルの XML を使用していることに注意してください。

メッセージ 1:

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

メッセージ 2:

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

メッセージ 1 に続いてメッセージ 2 を MSMQ に送信すると、両方ともキューに正しく表示されます。その後、Python スクリプトを呼び出すと、メッセージ 1 は正しく返されますが、メッセージ 2 はポスト 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

MSMQ固有というよりも、本当にPython固有(私は何も知らない)に聞こえます。これは、メモリ変数がクリアされずに 2 回使用されているだけのケースではありませんか? 2 番目のメッセージは最初のメッセージよりも短いため、最初のメッセージの文字は上書きされません。Python コードの関連部分はどのように見えますか?

[[4 月 21 日]] このコードは、tmp 変数にメッセージを入力していることを示しています。次のメッセージがアクセスされる前に tmp はどうなりますか? 未クリアだと思います。

于 2012-04-20T18:20:33.103 に答える