1 つのプロセスにレシーバーを持つ非 tx キューと、MessageQueue.Send( object, label ) メソッドを使用してメッセージをキューに入れる PowerShell スクリプトがあります。ときどき、PowerShell スクリプト (送信側) で次の奇妙なエラーが発生します。
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 で記述されたサービス) は、queue.Peek( 1s timeout ) を実行してから queue.Receive() を呼び出す while ループで作業を行っています。すべての 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 バイトのメッセージ本文を生成します。キュー、センダー、レシーバーは同じマシン上にあります。