私は非常に困惑している問題に直面しています。 2つのMSMQキューを監視し、別のMSMQキューにメッセージを送信するWindowsサービスがあります。送信操作はサービスの観点からは瞬時に見えますが、MSMQ MMCのプロパティウィンドウに表示されているように、実際にメッセージが到着するまでに3分ほどかかります。私はこの問題を他の側で聞いて何もテストしていないので、メッセージが積もってくるのを見ることができます。サービスがメッセージを送信する方法は次のとおりです。MSMQメッセージは常に同じマシンに3分遅れて到着します
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でそれをテストし、同じ動作に気づいた。繰り返しますが、すべて同じマシン上で起こります。すべてのコンポーネントがそこに配備されているので、ネットワーク上の問題ではないと思います。
EDIT#1:
私は、WCFの診断をオンにし、私が気づいたことは非常に奇妙です。 MSMQデータグラムは正常に書き込まれます。ただし、「メッセージが閉じた」トレースメッセージの後には何も起こりません。サービスが何か起こるのを待っているかのようです。正確に3分後、正確にMSMQメッセージが到着すると(MSMQ MMCに従って)、以前のアクティビティに関する別のトレースメッセージが表示されます。私はある種の干渉があると思う。
サービスの仕組みについて詳しく説明します。クライアントからタスクを受け取り、それらをMSMQキューにドロップするIISアプリケーションがあります。そこから、厄介なサービス(MainService)がそれらを取り出し、それらの処理を開始します。場合によっては、MainServiceがAuxServiceに(常に遅延した)メッセージを送信するように、タスクを完了するために別のサービス(AuxService)が必要な場合もあります。 AuxServiceには、MSMQメッセージを受信する独自の受信トレイキューがあり、完了したらMainServiceにMSMQメッセージを送信します。その間、AuxServiceにメッセージを送信したスレッドは、シグナルを受信するまで、またはタイムアウトするまで待機します。 MainServiceがAuxServicesからのメッセージを探す特殊なキューがあります。メッセージが受信されると、上記のスレッドが起動され、その活動が再開される。
ここ全体アーキテクチャの表現は次のとおり
- IISアプリ - > Q1 - > MainService
- MainService - > Q2 - > AuxService
- AuxService - > Q3 - > MainService
すべての操作はOneWayでマークされていますが、別のMSMQ操作内からMSMQ操作を開始するのはどういうわけか不思議です。経験的な証拠が与えられていると思われる。もしそうなら、この行動を変えることはありませんか?
EDIT#2:
よしは、いくつかのより多くの掘りの後には、WCFが犯人であると思われます。私は、MainServiceのクライアントコードとAuxServiceのサーバーコードの両方をMSMQ SDKを直接使用するように切り替え、期待通りに動作します。私が経験していた3分のタイムアウトは、実際にはMainServiceがあきらめてAuxServiceが失敗したと考えられた時間でした。したがって、何らかの理由でWCFが現在のWCFアクティビティが終了するまで、WCFが送信を拒否しているようです。
これは仕様ですか?それともバグですか?この動作は制御できますか?
認証を使用していますか?これらの遅延は、認証に関連するネットワーキング/インフラストラクチャの問題に関連する場合があります。 – Groo
私は認証を使用しません。さらに、 'Everyone'はキューにフルアクセスできます。 –
ローカルキューへの送信操作は、送信キューが不要なため、瞬時に実行されます。パフォーマンスモニタを使用してMSMQを追跡した場合、メッセージの送信時にそのメッセージが表示されることが期待されます。そうでなければ、トランザクションがコミットするのを待つ遅延かもしれません。 Easy7テストは、非トランザクションキューに送信し、同じ遅延が発生するかどうかを確認することです。 –