2

WCF でアクティブ化されたワークフロー サービス (XAMLX) のセットアップがあります (WorkflowServiceHost を使用してホストされています)。

この WCF WebService には、'NetMsMqBinding' バインディングと、クライアントが操作をスケジュールするために使用する net.msmq ベースのエンドポイントがあります。

クライアント側では、Visual Studio を使用してプロキシ スタブを生成し、この WCF サービスと通信しました。すべてが正常に機能しており、サーバー上の (ジャーナリングされた) MQ にメッセージが表示され、WCF がキューからメッセージを取得して、メッセージに基づいて構成されたワークフローをアクティブにすることがわかります。

MQ に送信されるメッセージの優先順位を制御して、特定の WCF クライアントがワークフローの処理を優先できるようにする必要があります。

NetMsMqBinding は実際には MQ メッセージの優先順位付けをサポートしていないようです。これは正しいです?もしそうなら、どうすればこれを達成/シミュレートできますか? MQ トリガーを使用して、フラグに基づいてメッセージの優先度を変更できますか?

4

2 に答える 2

4

誰かがこれを理解する必要がある場合に備えて、私の解決策を投稿する

NetMSMQBindingクライアント側からのメッセージ優先度の設定をサポートしていないため、間違ったバインディングを使用していました。より強力なMsMqIntegrationBindingのは正しい道です。

クライアント側:クライアント側からは、オブジェクトを作成し、優先度を設定して、宛先MQを指すオブジェクトにSystem.Messaging.Messageドロップするだけです。MessageQueue.MessageQueue

サーバー側:WorkflowServiceホスティングWCFプロジェクトには、web.configに次のendpointBindingが必要です。


<endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyWebService/MyProcessingService.xamlx" binding="msmqIntegrationBinding" bindingConfiguration="MyMsMqIntegrationBinding" contract="IMyProcessingService" name="MqIntegrationBindingEndPoint" />

(アドレスは、MQサービスがホストされているWCFに対してローカルであると想定しています)

<bindings> <!--We use msmqIntegrationBinding instead of netMsmqBinding since we want to control priority of MQ messages being dropped in the queue and that is not supported in netMsmq --> <msmqIntegrationBinding> <binding name="MyMsMqIntegrationBinding" exactlyOnce="false"> <security mode="None" /> </binding> </msmqIntegrationBinding>


MQからMsmqMessageを受信して​​処理する方法は、XAMLXに「Receive」アクティビティをドロップしMessage、コンテンツ定義MessageTypeとして選択するSystem.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere>ことです。これMsmqMessage<yourType>で、からActivityContext送信された値を取得できるようになります。メッセージ。

これは、優先度制御MQ + WCF+WFベースのWebサービスでスケーラブルなスロットルを構築するための非常に便利で強力な方法です。

于 2012-08-14T05:59:27.913 に答える
1

これらはトランザクション メッセージですか? その場合、優先順位をまったく変更できません。

メッセージは不変であるため、既に送信された非トランザクション メッセージの優先度を変更することはできません。

乾杯
ジョン・ブレイクウェル

于 2012-03-09T12:57:31.623 に答える