2012-04-20 11 views
0

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を監視する小さなプログラムを作成し、メッセージが到着したときにそれを取り出して別のサーバーに送信します。

感謝/

答えて

0

は、MSMQ固有いうし、(私は何も知らないうち)本当にPythonの固有のサウンド。これは、間にクリアされずに2回使用されるメモリ変数のケースではありませんか?第2のメッセージは第1のメッセージよりも短く、第1のメッセージは上書きされない。 Pythonコードの関連部分はどのように見えますか?

[[21st April]] このコードは、tmp変数にメッセージを入力していることを示しています。次のメッセージにアクセスする前にtmpはどうなりますか?私はそれがクリアされていないと仮定しています。

+0

関連するコードをいくつか追加しました。 – Gareth

+0

これを投稿した後、私はおそらくメッセージをつかむために別の言語のプログラムを書いて、どう見ているのかを見てみるべきです。月曜日にそれを行って、問題を1つの要因に分離する必要があります。 – Gareth

+1

John、ごめんなさいあなたの編集された答えを逃しました。私はtmp変数を単一の文字長文字列に設定するコードを追加しようとしましたが、問題は残ります。私はまた、問題なしでC#でこれを実装しました。だから私は離れて移動している言語であるPyhtonに頼らずにサーバーコールをしようとしています。しかし、助けてくれてありがとう。 – Gareth

関連する問題