2013-09-16 16 views
6

私は非常に困惑している問題に直面しています。 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が送信を拒否しているようです。

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

+0

認証を使用していますか?これらの遅延は、認証に関連するネットワーキング/インフラストラクチャの問題に関連する場合があります。 – Groo

+0

私は認証を使用しません。さらに、 'Everyone'はキューにフルアクセスできます。 –

+0

ローカルキューへの送信操作は、送信キューが不要なため、瞬時に実行されます。パフォーマンスモニタを使用してMSMQを追跡した場合、メッセージの送信時にそのメッセージが表示されることが期待されます。そうでなければ、トランザクションがコミットするのを待つ遅延かもしれません。 Easy7テストは、非トランザクションキューに送信し、同じ遅延が発生するかどうかを確認することです。 –

答えて

1

キューコードでトランザクションをセットアップしましたが、トランザクション用にmsmqオブジェクトをセットアップしていますか? Distributed Transaction Coordinator参加のタイムアウト期間のように聞こえる3分。

関連する問題