2011-01-17 14 views
2

1つのプロセスに受信者を持つ非txキューと、MessageQueue.Send(object、label)メソッドを使用してメッセージをエンキューするPowerShellスクリプトがあります。 は時折私は、PowerShellスクリプト(送信者)で、この奇妙なエラーが出ます:InvalidOperationException、BadEnumeratorでMessageQueue.Sendが失敗することがある

An error occurred while enumerating through a collection: Message that the cursor is currently pointing to has been removed from the queue by another process or by another call to Receive without the use of this cursor.. 
+ CategoryInfo   : InvalidOperation: (System.Messaging.MessageEnumerator:MessageEnumerator) [], RuntimeException 
+ FullyQualifiedErrorId : BadEnumeration 

私はMessageEnumeratorが送信部に巻き込ま方法を理解できないのですか?すべての手がかりは?

受信部(MSMQとやりとりするSystem.Messagingを使用しても.netで書かれたサービス)は、キューを実行するwhileループでその処理を行っています.Peek(1秒のタイムアウト) .Receive()。 すべてのMSMQ例外は受信者によって記録されますが、ログは空です。すべてのエラーは、送信PowerShellスクリプトで発生します。

レシーバは、動作することがわかっている古いコードですが、スクリプトは新しく、テストされていません。 私のテストでは、受信機が接続されていないテストマシンでエラーは発生しませんでした。

最初に受信者が接続された状態で、MessageQueue.Send()を呼び出すとエラーが発生しました。

このスクリプトは、このように見えた:問題は解放されていない共有リソースなどに関連していた場合、私は、各反復でキューインスタンスを配置しようとした

begin { 
    $q = Create-QueueInstance 
} 
process { 
    $messagesToSend | %{ 
     Send-Message $q $_ 
    } 
} 
end { 
    $q.Dispose() 
} 

セカンドショット:

ことスクリプトは次のようになりました。

process { 
    $messagesToSend | %{ 
     $q = Create-QueueInstance 
     Send-Message $q $_ 
     $q.Dispose() 
    } 
} 

エラーはまだ発生しますが、発生頻度は低いと思います。

デフォルトのコンストラクタを使用して、キューインテンスを作成し、DefaultPropertiesToSendなどのカスタマイズは行いません。 メッセージはXMLのシリアル化可能なオブジェクトで、300バイトのメッセージ本文を生成します。 キュー、送信側および受信側は同じマシン上にあります。

答えて

0

なぜサービスはPeek-then-Receiveですか?
メッセージが必要なものかどうかをチェックしていますか?
もしそうなら、PeekNextを使用してキューを移動しますか?
レシーバサービスはマルチスレッドですか?
カーソルがどこに来るのか分かりません。

かなり奇妙な問題。

乾杯 ジョンBreakwell

+0

1.私は本当に知りませんが、私は、メッセージの処理が失敗した場合、それはガードであると信じています。 2.メッセージをチェックしていないので、プロセスは実際にはPeek-Process-Receive です。3.いいえ、この呼び出しを使用しています:queue.Peek(new TimeSpan(0、0、1)) 4.まあ、そうです。スレッドを開始するWindowsサービスですが、キューからのメッセージを消費するスレッドはそのスレッドだけです。 すべての良い質問ありがとう! –

+0

はい、Peek-then-receiveは、古いバージョンのMSMQで障害が発生した場合にメッセージを処理する古典的な方法です。ただし、MSMQ 4.0以上でトランザクション受信を使用する必要があります。 –

関連する問題