当传出标头是静态的时,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转到静态字段。
我正在尝试弄清楚如何为下一个消息设置标头。但是,如果我按照这些示例,我最终会为所有消息设置标题。
答案 0 :(得分:4)
[由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的标签链接(编写时的当前内容),希望链接不会过期。