3

送信ヘッダーが静的な場合、NServiceBus はどのように一貫性を維持していますか?

特定のメッセージの送信ヘッダーを設定すると、それはシングルトンであるため、他のすべての送信メッセージに影響を与えるということですか?

namespace NServiceBus.MessageHeaders
{
  [ComVisible(false)]
  public class MessageHeaderManager : IMutateOutgoingTransportMessages
  {
    private static IDictionary<string, string> staticOutgoingHeaders = (IDictionary<string, string>) new Dictionary<string, string>();
    private IUnicastBus bus;
    [ThreadStatic]
    private static IDictionary<object, IDictionary<string, string>> messageHeaders;
   .
   .
   .
 }

ただし、着信ヘッダーは正しくマークされているよう[ThreadStatic]です。

説明。

========================編集======================== =====

多くの例が以下のコードを示しているため、理解しようとしていると思います。

Bus.OutgoingHeaders["Test"] = g.ToString("N");

これは次のように追跡されます:

IDictionary<string, string> IBus.OutgoingHeaders
{
  get
  {
    return ExtensionMethods.GetStaticOutgoingHeadersAction();
  }
}

に設定されています:

内部クラス Bootstrapper : INeedInitialization, IWantToRunWhenConfigurationIsComplete { public MessageHeaderManager Manager { get; 設定; }

void INeedInitialization.Init()
{
  Configure.Instance.Configurer.ConfigureComponent<MessageHeaderManager>(DependencyLifecycle.SingleInstance);
}

public void Run()
{
  ExtensionMethods.GetHeaderAction = (Func<object, string, string>) ((msg, key) => this.Manager.GetHeader(msg, key));
  ExtensionMethods.SetHeaderAction = (Action<object, string, string>) ((msg, key, val) => this.Manager.SetHeader(msg, key, val));
  ExtensionMethods.GetStaticOutgoingHeadersAction = (Func<IDictionary<string, string>>) (() => this.Manager.GetStaticOutgoingHeaders());
}

}

そしてもちろん、上記の最後の行の GetStaticOutgoingHeaders は static フィールドになります。

次のメッセージのために、ヘッダーを設定する方法を見つけようとしています。しかし、例に従うと、すべてのメッセージのヘッダーを設定することになります。

4

1 に答える 1

4

[Udi による更新]送信する特定のメッセージにヘッダーを設定する場合は.SetHeader(key, value);、メッセージ オブジェクトでメソッドを呼び出すだけです。静的な送信ヘッダーは、ログインしているユーザーがデスクトップ アプリケーションに誰であるかなど、プロセス全体のデータに役立ちます。【更新終了】

MessageHeaderManagerは、IMutateOutgoingTransportMessages送信中のメッセージのみに関係することを意味します。ここに表示される受信メッセージ ヘッダーはありません。

messageHeaders送信時間など、メッセージごとに設定されるヘッダー、またはメッセージハンドラーから手動で設定するものに関係しています。

staticOutgoingHeaders値を再計算する必要がないように、エンドポイントからのすべてのメッセージで同じすべてのヘッダーをキャッシュする場所です。これには、ソース マシン名などが含まれます。

その MutateOutgoing メソッドの中身を調べると、 と の両方からのすべてのキーmessageHeadersと値のペアがコレクションstaticOutgoingHeadersに追加されていることがわかります。transportMessage.Headersさらに、thread-static コレクションの項目が同じ名前の static ヘッダーをオーバーライドするようにHeaders.Add(key, value)、thread-static ヘッダーが追加される間に static ヘッダーが追加されます。Headers[key] = value

GitHub のこのクラスの完全なソースへのリンクは、V4.0.3 (執筆時点で最新) のタグでリンクされているため、リンクが期限切れにならないことを願っています。

于 2013-08-23T21:10:08.303 に答える