我在ASP.net Web API项目中使用带有SQLTransport的NServicebus(版本4.6.3)。对于不同环境(Dev,QA等)的队列,我具有不同的连接字符串。我的配置如下所示:
public class BusConfigurator
{
public static IStartableBus Bus { get; private set; }
public static void DisposeBus()
{
if (Bus == null)
return;
Bus.Shutdown();
Bus.Dispose();
Bus = null;
}
public static void InitializeServiceBus(string connectionString)
{
var configure = Configure.With()
.DefineEndpointName("MyEndPoint")
.Log4Net(new DebugAppender { Threshold = Level.Warn })
.UseTransport<SqlServer>(connectionString)
.PurgeOnStartup(false)
.SetDefaultTransactionLevel()
.UnicastBus(); // Error is thrown here on second call
configure.MyCustomSQLServerPersistence();
Bus = configure.CreateBus();
}
public static void StartBus()
{
Bus.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
}
}
我在应用程序中有一个下拉菜单,以便用户可以选择环境。根据选择,我想重新配置总线。因此,我调用DisposeBus,然后将连接字符串传递给InstartizeServiceBus方法,再传递给startBus。它第一次工作,但是当使用不同的连接字符串再次调用它时,会在下面抛出错误:
无法设置键的值:NServiceBus.Transport.ConnectionString。设置已被锁定以进行修改。请更早地在配置管道中移动任何配置代码Source = NServiceBus.Core Line = 0 BareMessage =无法设置以下项的值:NServiceBus.Transport.ConnectionString。设置已被锁定以进行修改。请在配置管道中更早地移动任何配置代码
是否打算以这种方式使用/配置NServicebus?(我猜可能不是)如果没有,那么是否有解决方法/不同的方法?
在V4或更低版本中,无法通过正常的人工方式来做到这一点。每个AppDomain仅有一辆公交车。所有的配置API都是静态的,因此,如果您尝试使用该API,则完全可以解决遇到的问题。
通过“人为手段”,我的意思是可能有可能做一些疯狂的事情,包括在过程中旋转一个新的AppDomain,在其中建立Bus,然后在完成后将其拆除。有可能。我还没试过 我不推荐它。
在V5中,完全重新设计了配置API,它不是静态的,因此这是可能的:
var cfg = new BusConfiguration();
// Set up all the settings with the new V5 Configuration API
using (var justOneBus = NServiceBus.Bus.Create(cfg).Start())
{
// Use justOneBus, then it gets disposed when done.
}
这是正确的。它是一次性的。然后,您可以再次执行此操作。在您的情况下,您不想将其放在一个using
块中-您希望将其设置在某个位置,并且当下拉菜单切换时,请在当前实例上调用Dispose并使用新参数对其进行重建。
但是请记住,该总线的创建成本仍然很高。您仍然仍然要将其视为应用程序范围内的单例(或类似单例)实例。您绝对不希望每个Web请求单独启动一个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句