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

时间:2013-08-23 20:33:21

标签: c# message-queue nservicebus soa

当传出标头是静态的时,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]

解释

======================== EDIT ====================== ======

我想我正在努力理解,因为很多例子都显示了以下代码:

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转到静态字段。

我正在尝试弄清楚如何为下一个消息设置标头。但是,如果我按照这些示例,我最终会为所有消息设置标题。

1 个答案:

答案 0 :(得分:4)

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

MessageHeaderManagerIMutateOutgoingTransportMessages,这意味着它只关注他们出路时的消息。这里没有显示传入的消息标题。

messageHeaders涉及按消息设置的标头,如发送的时间,或者您将从消息处理程序手动设置的任何内容。

staticOutgoingHeaders是一个缓存端点中每条消息都相同的所有标头的地方,因此不需要重新计算它们的值。这将包括源机器名称等。

如果您查看MutateOutgoing方法的内容,您会看到来自messageHeadersstaticOutgoingHeaders的所有键/值对都会添加到transportMessage.Headers集合中。此外,静态文件添加Headers.Add(key, value),而线程静态标头通过Headers[key] = value添加,以便线程静态集合中的项目将覆盖相同名称的静态标头。

这是一个link to the full source for this class on GitHub,由V4.0.3的标签链接(编写时的当前内容),希望链接不会过期。