0

nservicebus のワーカー スレッドのリストを取得するにはどうすればよいですか。workerThread id を db に登録してから、ある種のメッセージを正確な workerthread にバインドする必要があります。本当のアイデアは、有害なメッセージを処理することです。特定のスレッド以外の有害なメッセージを処理しないように、すべてのスレッドをブロックしたい。データベースを介してスレッドを管理する別のサービスがあります。

4

1 に答える 1

1

私はそれをしようとはしません。ほぼ確実に問題が発生します。

もちろん、スレッドごとにある種の「ID」を取得するために、メッセージ ハンドラーに次のようなものを配置できます。

[ThreadStatic]
private static readonly Guid ThreadId = Guid.NewGuid();

しかし、繰り返しますが、私はそれをしません!エンドポイントが再起動されるたびに、GUID が変更されます。

また、.NET から直接スレッドのリストをクエリして、どのスレッドがメッセージ処理スレッドであったかを判断しようとすることもできますが、それはあまりにも恐ろしく聞こえます。

本当の問題: Poison メッセージ処理

あなたのコメントが述べているように、本当の問題は、有害なメッセージが本当に有害であるということです. 失敗するだけでなく、実行に時間がかかりすぎて、他のすべてのスレッドを台無しにしてしまいます!

メッセージの特定のプロパティに基づいてこれらのメッセージを識別できるため、タイムアウトになる操作の前に例外を検出してスローします。いつも。

問題が修正されたかどうかを定期的にテストできるようにする場合は、いくつかのオプションがあります。

  1. 他の方法でテストし、修正されたらメッセージをソース キューに戻します。
  2. 構成設定が有効になっているときにクイックスロー動作がスキップされるように、appSetting を追加します。その後、定期的に構成を編集し、エンドポイントを再起動して、修正されているかどうかを確認し、修正されていない場合は元に戻すことができます。
  3. ゼロのスレッド ロックされたインクリメント値を維持する別のメッセージ ハンドラーを作成します。「ねえ、今すぐ試して」という制御メッセージを送信します。次に、クイックスロー動作でその値を減らし、何が起こるかを確認できます。これももちろん危険です。異なるメッセージ処理スレッド間でこの状態を共有しているため、ロックがしっかりしていることを確認してください。
于 2012-10-02T16:07:48.123 に答える