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バイトのメッセージ本文を生成します。 キュー、送信側および受信側は同じマシン上にあります。
1.私は本当に知りませんが、私は、メッセージの処理が失敗した場合、それはガードであると信じています。 2.メッセージをチェックしていないので、プロセスは実際にはPeek-Process-Receive です。3.いいえ、この呼び出しを使用しています:queue.Peek(new TimeSpan(0、0、1)) 4.まあ、そうです。スレッドを開始するWindowsサービスですが、キューからのメッセージを消費するスレッドはそのスレッドだけです。 すべての良い質問ありがとう! –
はい、Peek-then-receiveは、古いバージョンのMSMQで障害が発生した場合にメッセージを処理する古典的な方法です。ただし、MSMQ 4.0以上でトランザクション受信を使用する必要があります。 –