7

私は非常に不可解な問題に直面しています。入力用に 2 つの MSMQ キューを監視し、メッセージを別の MSMQ キューに送信する Windows サービスがあります。サービスの観点からは、送信操作は瞬時に行われるように見えますが、実際にはメッセージが到着するまでにちょうど 3 分かかります (MSMQ MMC のプロパティ ウィンドウに表示されます)。メッセージが山積みになっているのを見ることができるように、反対側で何も聞いていない状態でこの問題をテストしてきました。これは、サービスがメッセージを送信する方法です。

var proxyFactory = new ChannelFactory<IOtherServerInterface>(new NetMsmqBinding(NetMsmqSecurityMode.None)
{
    Durable = true,
    TimeToLive = new TimeSpan(1, 0, 0),
    ReceiveTimeout = TimeSpan.MaxValue
});

IOtherServerInterface server = this.proxyFactory.CreateChannel(new EndpointAddress("net.msmq://localhost/private/myqueue"));

var task = new MyTask() { ... };
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    server.QueueFile(task);
    scope.Complete();
}

サービスは Windows Server 2008 R2 で実行されています。R1 でもテストしたところ、同じ動作に気付きました。繰り返しますが、すべてが同じマシン上で行われます。すべてのコンポーネントがそこにデプロイされているので、ネットワークの問題である可能性はないと思います.

編集#1:

WCF 診断を有効にしましたが、非常に奇妙なことに気付きました。MSMQ データグラムは正常に書き込まれます。ただし、「メッセージが閉じられました」というトレース メッセージの後、何も起こりません。サービスが何かが起こるのを待っているかのようです。ちょうど 3 分後、MSMQ メッセージが到着したとき (MSMQ MMC によると)、以前のアクティビティに関する別のトレース メッセージが表示されます。なんらかの干渉があると思います。

サービスの仕組みについて詳しく説明します。クライアントからタスクを受け取り、MSMQ キューにドロップする IIS アプリがあります。そこから面倒なサービス(MainService)が拾い上げて処理を開始します。場合によっては、タスクを完了するために別のサービス (AuxService) が必要になるため、MainService は (常に遅延する) メッセージを AuxService に送信します。AuxService には、MSMQ メッセージを受信する独自​​の受信トレイ キューがあり、受信が完了すると、MSMQ メッセージを MainService に送信します。その間、メッセージを AuxService に送信したスレッドは、シグナルを受信するかタイムアウトになるまで待機します。MainService が AuxServices からのメッセージを探す特別なキューがあります。メッセージが受信されると、上記のスレッドが起動され、そのアクティビティが再開されます。

アーキテクチャ全体の表現は次のとおりです。

  • IIS アプリ -> Q1 -> MainService
  • MainService -> Q2 -> AuxService
  • AuxService -> Q3 -> MainService

すべての操作は OneWay でマークされていますが、別の MSMQ 操作内から MSMQ 操作を開始することは何らかの形で違法ではないかと考えています。経験的証拠を考えると、そうであると思われる。もしそうなら、この動作を変更する方法はありますか?

編集#2:

わかりました、さらに掘り下げた後、WCFが原因のようです。MainService のクライアント コードと AuxService のサーバー コードの両方を MSMQ SDK を直接使用するように切り替えたところ、期待どおりに動作しました。私が経験していた 3 分間のタイムアウトは、実際には MainService があきらめて、AuxService が失敗したと見なされた時間でした。したがって、何らかの理由で、現在の WCF アクティビティが終了するまで、WCF は送信の実行を拒否しているようです。

これは仕様によるものですか、それともバグですか? この動作を制御できますか?

4

1 に答える 1

1

キュー コードにトランザクションを設定していますか? トランザクション用に msmq オブジェクトを設定していますか? 3 分というのは、分散トランザクション コーディネーターへの参加のタイムアウト期間のように聞こえます。

于 2013-09-19T02:57:05.103 に答える