6

BizTalk Server を使用して、MSMQ 経由でメッセージを送信しています。受信側システムでは、各メッセージの拡張プロパティが GUID (バイト配列として) に設定されている必要があります。MSDN は、MSMQMessage の Extension プロパティをここに、(.NET では)ここに文書化しています。

.NET で拡張プロパティを設定するのは簡単です。

const string messageContent = "Message content goes here";
var encodedMessageContent = new UTF8Encoding().GetBytes(messageContent);

// Create the message and set its properties:
var message = new System.Messaging.Message();
message.BodyStream = new System.IO.MemoryStream(encodedMessageContent);
message.Label = "AwesomeMessageLabel";
// Here is the key part:
message.Extension = System.Guid.NewGuid().ToByteArray();

// Bonus! Send the message to the awesome transactional queue:
const string queueUri = @"FormatName:Direct=OS:localhost\Private$\awesomeness";
using (var transaction = new System.Messaging.MessageQueueTransaction())
{
    transaction.Begin();
    using (var queue = new System.Messaging.MessageQueue(queueUri))
    {
        queue.Send(message, transaction);
    }
    transaction.Commit();
}

ただし、BizTalk の MSMQ アダプターは、メッセージ拡張子を設定可能なものとして表示しません ( MSDN のアダプター プロパティのリストを参照してください)。また、BizTalk 2013 に同梱されている Microsoft.BizTalk.Adapter.MSMQ.MsmqAdapter アセンブリを逆コンパイルしましたが、拡張プロパティへの参照が見つかりません。

BizTalk によって送信される MSMQ メッセージの拡張子を設定するにはどうすればよいですか? 大量のオーバーヘッドと継続的なメンテナンスが必要になるため、可能であればカスタム アダプターを作成する必要はありません。

4

1 に答える 1

3

この記事を見ましたか?http://msdn.microsoft.com/en-us/library/aa560725.aspx

この記事では、MSMQ の受信場所をプログラムで設定する方法を示します。さらに、必要であるが既定の BizTalk アダプター (拡張機能など) では表示されない可能性があるセカンダリ プロパティへのアクセスを公開します。

ManagementClass objReceiveLocationClass =
    new ManagementClass(
                    "root\\MicrosoftBizTalkServer",
                    "MSBTS_ReceiveLocation",
                    null);
// Create an instance of the member of the class
ManagementObject objReceiveLocation =
            objReceiveLocationClass.CreateInstance();

// Fill in the properties
objReceiveLocation["Name"] = name;
objReceiveLocation["ReceivePortName"] = port;
objReceiveLocation["AdapterName"] = adapterName;
objReceiveLocation["HostName"] = hostName;
objReceiveLocation["PipelineName"] = pipeline;
objReceiveLocation["CustomCfg"] = customCfg;
objReceiveLocation["IsDisabled"] = true;
objReceiveLocation["InBoundTransportURL"] = inboundTransport;

// Put the options -- creates the receive location
objReceiveLocation.Put(options);

編集:

BizTalk MSMQ アダプター コードをインターフェイス レベルまで逆コンパイルした後、既定のアダプターを使用してこれを行う方法がわかりません。アダプタは密閉されているため、延長することもできません。

私が見つけた唯一の他のオプションは

  1. カスタムアダプターを作成します(すでにリストしたとおり)
  2. ハック 1:データを MSMQ アダプター (ラベルなど) がアクセスできるプロパティに配置し、外部プロセスでメッセージをインターセプトし、そこで変換します。
  3. ハック 2: PowerShell スクリプトを呼び出すために既に作成されているカスタム アダプターを使用し、そのスクリプトで必要な変換/送信を行います。http://social.technet.microsoft.com/wiki/contents/articles/12824.biztalk-server-list-of-custom-adapters.aspx#BizTalk_PowerShell_Adapter
  4. ハック 3:要件を再定義します。たとえば、必要なフィールドを Extension から利用可能なもの (Label など) に変更するよう受信者に依頼します。
  5. ハック 4: WCF-MSMQ アダプター経由でメッセージを送信する方法を見つけようとします。http://msdn.microsoft.com/en-us/library/system.servicemodel.netmsmqbinding.aspx

編集:( 拡張プロパティを設定すべきではない理由)

Extension プロパティは、メッセージの合計サイズが 4MB を超える場合に転送中に断片化される大きなメッセージをリンクするために使用されます。これは裏で行われ、回避された場合、大きなメッセージが破損する可能性があります。

大規模なメッセージ交換に参加するには、メッセージ キュー コンピュータに Mqrtlarge.dll ファイルがインストールされている必要があり、メッセージ キュー アプリケーションはアドオン API を使用する必要があります。そうしないと、完全なメッセージが断片化されます。

BizTalk 2004 ラージ メッセージ拡張のドキュメント

BizTalk 2010 ラージ メッセージ拡張のドキュメント

于 2013-09-16T12:21:05.057 に答える