我希望在一个过程中有几个总线。我搜索了这个,发现只有拥有多个AppDomain才有可能。但我不能让它发挥作用。
这是我的代码示例(我在一个类库中执行所有操作):
using System;
using System.Diagnostics;
using System.Reflection;
using MyMessages;
using NServiceBus;
using NServiceBus.Config;
using NServiceBus.Config.ConfigurationSource;
namespace Subscriber1
{
public class Sender
{
public static void Main()
{
var domain = AppDomain.CreateDomain("someDomain", AppDomain.CurrentDomain.Evidence);
domain.Load(Assembly.GetExecutingAssembly().GetName());
domain.CreateInstance(Assembly.GetExecutingAssembly().FullName, typeof (PluginBusCreator).FullName);
//here I have some code to send messages to "PluginQueue".
}
}
public class PluginBusCreator
{
public PluginBusCreator()
{
var Bus = Configure.With(
Assembly.Load("NServiceBus"), Assembly.Load("NServiceBus.Core"),
Assembly.LoadFrom("NServiceBus.Host.exe"), Assembly.GetCallingAssembly())
.CustomConfigurationSource(new PluginConfigurationSource())
.SpringFrameworkBuilder()
.XmlSerializer().MsmqTransport()
.UnicastBus().LoadMessageHandlers<First<SomeHandler>>().CreateBus().Start();
}
protected IBus Bus { get; set; }
}
class PluginConfigurationSource : IConfigurationSource
{
public T GetConfiguration<T>() where T : class
{
{
if (typeof (T) == typeof (MsmqTransportConfig))
return new MsmqTransportConfig
{
ErrorQueue = "error",
InputQueue = "PluginQueue",
MaxRetries = 1,
NumberOfWorkerThreads = 1
} as T;
return null;
}
}
}
public class SomeHandler : IHandleMessages<EventMessage1>
{
public void Handle(EventMessage1 message)
{
Debugger.Break();
}
}
}
我没有调用处理程序。 如果您有任何想法,请帮忙。我很多时候都在解决这个问题。 如果需要发布完整代码,请告知。
我需要几辆公共汽车来解决以下问题:
我有我的目标应用程序,以及几个插件。我们决定根据服务总线模式制作插件。
每个插件都可以有多个配置文件。
因此,目标应用程序(它是Web应用程序。)是发布消息,其中的内容已发生变化。订阅此消息的每个插件都需要为每个配置文件执行一些操作。但插件对其配置文件一无所知(客户正在编写插件)。当消息处理开始时,插件应该只在其中注入配置文件。
我们决定使用一些RecepientList(模式在“企业集成模式”中描述),它知道插件配置文件,遍历它们并重新发送带有注释配置文件的消息。(因此,如果插件有多个配置文件,则会有几条消息被送到它)。
但我不希望在新进程中调用每个插件。完全我想在启动时为每个插件动态配置总线。一切都在一个过程中。但似乎我需要在单独的AppDomains中执行此操作。所以我遇到了上述问题: - )。
答案 0 :(得分:1)
塞吉,
我不清楚为什么每个插件都需要有自己的总线。他们都不能坐在同一辆公共汽车上吗?每个插件开发人员都会像以前一样编写他们的消息处理程序,订阅将由总线自动发生。
然后,您也不需要指定加载每个NServiceBus DLL。
顺便说一句,按名称加载程序集往往会导致问题 - 尝试使用它来指定程序集:
typeof(IMessage).Assembly,typeof(MsmqTransportConfig).Assembly,typeof(IConfigureThisEndpoint).Assembly