2

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 バイトのメッセージ本文を生成します。キュー、センダー、レシーバーは同じマシン上にあります。

4

1 に答える 1

0

サービスが Peek-then-Receive を行うのはなぜですか?
メッセージが望んでいたものかどうかを確認していますか?
その場合、PeekNext を使用してキューを下に移動しますか?
受信側サービスはマルチスレッド化されていますか?
カーソルが入る場所を見つけようとしているだけです。

かなり奇妙な問題。

乾杯ジョン・ブレイクウェル

于 2011-01-17T22:18:48.117 に答える