2

キューからメッセージを覗く単純なコードを持つ

message = myQueue.Peek(TimeOutForPeek);

一方、メッセージは単純にキューに送信されます。

sendQueue.Send(message);

myQueue がトランザクション対応の場合、すべて正常に機能します。しかし、そうでない場合、一定時間実行した後、例外が発生し (以下を参照)、処理が停止します。

System.Messaging.MessageQueueException (0x80004005): 操作が完了する前にキャンセルされました。System.Messaging.MessageQueue.ReceiveCurrent (TimeSpan タイムアウト、Int32 アクション、CursorHandle カーソル、MessagePropertyFilter フィルター、MessageQueueTransaction internalTransaction、MessageQueueTransactionType transactionType) で System.Messaging.MessageQueue.Peek (TimeSpan タイムアウト) で

何がそのような違いを引き起こす可能性があり、そのような失敗にどのように対処するのでしょうか? 私は MSMQ にあまり詳しくありませんが、助けていただければ幸いです。

4

1 に答える 1

2

私はそれに指を置くことはできませんが、少なくともエラーメッセージは、特定の時間内に終了しない長時間実行プロセスがあることを明らかに示しています.

上記のコメントで述べたように、短期間に 3000 ~ 5000 件のメッセージを受信したと述べたように、受信システムはエラーが発生したときにそれらの処理にまだビジーであり、エラーが発生する前に次のメッセージを読み取るのに十分なほどすぐに返されないと思います。タイムアウトが発生します。

システムのリソース制限に達している可能性がありますか?

あなたの説明は当てはまります... たとえば、マシンは非常に多くのメッセージを受信して​​いますが、次のメッセージが到着する前に十分な速さで処理できません。

トランザクション キューで機能する場合、MSMQ リソースの処理は両方のシナリオで異なると思われます。

John Breakwell の非常に詳細なブログ投稿 Insufficient Resources?をご覧ください。逃げろ逃げろ!そして、あなたが役立つと思うことがあるかどうかを確認してください。そこにはたくさんのものがあります。

その他の考え:

受信側がシングル スレッドであり、メッセージを並列処理していない場合は、並列処理を検討してください (シナリオに該当する場合)。これにより、新しいメッセージが到着する前にメッセージをキューからすばやく取り出すことができます。

于 2012-11-28T12:46:46.867 に答える