将我的NServiceBus从3.2.8升级到4.6.1:
我有一个看起来像这样的EndPoint.c:
using System;
using NServiceBus;
namespace GripMonitor
{
public class EndPointConfig : IWantCustomInitialization, IConfigureThisEndpoint, AsA_Client
{
public void Init()
{
SetLoggingLibrary.Log4Net(log4net.Config.XmlConfigurator.Configure);
Configure.With(AllAssemblies.Except("Oracle.DataAccess.dll"))
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport().TransactionTimeout(TimeSpan.FromMinutes(5))
.IsTransactional(true)
.UnicastBus()
.DoNotCreateQueues()
.SendOnly();
}
}
}
现在看起来像这样:
using System;
using NServiceBus;
namespace GripMonitor
{
public class EndPointConfig : IWantCustomInitialization, IConfigureThisEndpoint, AsA_Client
{
public void Init()
{
SetLoggingLibrary.Log4Net(() => log4net.Config.XmlConfigurator.Configure());
Configure.Transactions.Enable().Advanced( s=> s.DefaultTimeout(TimeSpan.FromMinutes(5)));
Configure.Serialization.Xml();
Configure.With(AllAssemblies.Except("Oracle.DataAccess.dll"))
.DefaultBuilder()
.UseTransport<Msmq>()
.UnicastBus()
.DoNotCreateQueues()
.SendOnly();;
}
}
}
我收到以下未处理的异常,应用程序崩溃了:
无法设置key的值:Transactions.Enabled。设置已被锁定以进行修改。请在配置管道中提前移动任何配置代码。
删除最后一行://。SendOnly();解决了这个问题。
为什么会这样?
谢谢, 米格尔
编辑1:更改了标题
答案 0 :(得分:0)
拥有一个完全只发送的NServiceBus.Host端点有点奇怪,但它是可能的。根据我在代码中看到的命名空间的名称,我认为你只是监控某些内容并发送带有受监控事物状态的消息,这样才有意义。
但是,.SendOnly()
扩展方法实际上意味着在自托管时用作快捷方式,因为它最终确定了配置并立即返回IBus实例。
这是.SendOnly()
的实际(反映)代码:
public static IBus SendOnly(this Configure config)
{
Configure.Endpoint.AsSendOnly();
config.Initialize();
return config.Builder.Build<IBus>();
}
问题是,实现Init()
EndpointConfig
的{{1}}方法在Host的启动过程中首先运行(在我的博客中有更多相关信息)发布NServiceBus and the Mystery of IWantCustomInitialization),此时,端点即使 关闭 也无法完成。 NServiceBus.Host端点在启动期间尝试执行的默认操作是尝试修改已锁定和完成的相同设置,以便返回IWantCustomInitialization
实例。
我认为你可以在没有致电IBus
的情况下过关,或者只是在.SendOnly()
阻止之前插入Configure.Endpoint.AsSendOnly();
。