为什么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