其他分享
首页 > 其他分享> > 为什么NServiceBus OutgoingHeaders是静态的而不是ThreadStatic?

为什么NServiceBus OutgoingHeaders是静态的而不是ThreadStatic?

作者:互联网

当传出标头为静态时,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
  {
    公共MessageHeaderManager管理器{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进入一个静态字段.

我试图弄清楚如何为下一条消息设置标题.但是,如果按照示例进行操作,最终将设置所有消息的标题.

解决方法:

[由Udi更新]如果要在要发送的特定邮件上设置标头,只需调用.SetHeader(key,value);.消息对象上的方法.静态传出标头对于进程范围的数据很有用,例如登录用户在桌面应用程序中的身份.[最终更新]

MessageHeaderManager是IMutateOutgoingTransportMessages,这意味着它仅与邮件的发送有关.这里没有显示传入的邮件头.

messageHeaders与按消息设置的标头有关,例如发送时间或您可以从消息处理程序手动设置的任何内容.

staticOutgoingHeaders是在端点外缓存每个消息的所有标头的地方,因此不需要重新计算其值.这将包括源计算机名称之类的内容.

如果查看该MutateOutgoing方法的内容,您将看到messageHeaders和staticOutgoingHeaders中的所有键/值对都已添加到transportMessage.Headers集合中.此外,通过Headers.Add(key,value)添加静态项,同时通过Headers [key] = value添加线程静态头,以便线程静态集合中的项将覆盖同名的静态头.

这是一个link to the full source for this class on GitHub,由V4.0.3的标记链接(在撰写本文时为最新),因此希望该链接不会过期.

标签:message-queue,soa,c,nservicebus
来源: https://codeday.me/bug/20191030/1968400.html