Nservicebus n服务总线。如何在不同的AppDomain中启动多个总线?
我想在一个过程中有几辆公共汽车。我在谷歌上搜索了一下,发现只有拥有几个AppDomain才有可能。但我不能让它工作 这是我的代码示例(我在一个类库中执行所有操作):Nservicebus n服务总线。如何在不同的AppDomain中启动多个总线?,nservicebus,Nservicebus,我想在一个过程中有几辆公共汽车。我在谷歌上搜索了一下,发现只有拥有几个AppDomain才有可能。但我不能让它工作 这是我的代码示例(我在一个类库中执行所有操作): 使用系统; 使用系统诊断; 运用系统反思; 使用MyMessages; 使用NServiceBus; 使用NServiceBus.Config; 使用NServiceBus.Config.ConfigurationSource; 命名空间订阅1 { 公共类发送器 { 公共静态void Main() { var domain=AppD
使用系统;
使用系统诊断;
运用系统反思;
使用MyMessages;
使用NServiceBus;
使用NServiceBus.Config;
使用NServiceBus.Config.ConfigurationSource;
命名空间订阅1
{
公共类发送器
{
公共静态void Main()
{
var domain=AppDomain.CreateDomain(“someDomain”,AppDomain.CurrentDomain.Evidence);
Load(Assembly.getExecutionGassembly().GetName());
domain.CreateInstance(Assembly.getExecutionGassembly().FullName,typeof(PluginBusCreator.FullName);
//这里我有一些代码可以将消息发送到“PluginQueue”。
}
}
公共类插件创建器
{
公共插件创建器()
{
var Bus=Configure.With(
Assembly.Load(“NServiceBus”)、Assembly.Load(“NServiceBus.Core”),
Assembly.LoadFrom(“NServiceBus.Host.exe”),Assembly.GetCallingAssembly()
.CustomConfigurationSource(新的PluginConfigurationSource())
.SpringFrameworkBuilder()
.XmlSerializer().MsmqTransport()
.UnicastBus().LoadMessageHandlers().CreateBus().Start();
}
受保护的IBus总线{get;set;}
}
类PluginConfiguration源:IConfigurationSource
{
public T GetConfiguration(),其中T:class
{
{
if(typeof(T)=typeof(MsmqTransportConfig))
返回新的MsmqTransportConfig
{
ErrorQueue=“error”,
InputQueue=“PluginQueue”,
MaxRetries=1,
NumberOfWorkerThreads=1
}as-T;
返回null;
}
}
}
公共类SomeHandler:IHandleMessages
{
公共无效句柄(EventMessage1消息)
{
Debugger.Break();
}
}
}
我也不会调用处理程序。
如果你有任何想法,请帮忙。我一直在努力解决这个问题。
另外,如果需要发布完整代码,请告知
我需要几辆公交车来解决以下问题:
我有我的目标应用程序和几个插件。我们决定根据服务总线模式制作插件
每个插件可以有几个配置文件
所以,目标应用程序(它是web应用程序)正在发布消息,消息中有一些内容已更改。订阅此消息的每个插件都需要对每个概要文件执行一些操作。但插件对其配置文件一无所知(客户正在编写插件)。当消息处理开始时,插件中应该只注入配置文件
我们决定有一些RecepientList(模式在“企业集成模式”中描述),它了解插件配置文件,遍历它们,并使用注入的配置文件重新发送消息(因此,如果插件有多个配置文件,则会向它发送多条消息)
但我不想让每个插件在新的过程中被调用。我希望在启动期间为每个插件动态配置总线。一应俱全。但我似乎需要在不同的应用程序域中完成。所以我有一个上面描述的问题:-)。谢尔盖
我不清楚为什么每个插件都需要有自己的总线。难道他们不能坐在同一辆公共汽车上吗?每个插件开发人员都会像以前一样编写消息处理程序,订阅将通过总线自动进行
然后,您也不需要指定加载每个NServiceBus DLL
顺便说一句,按名称加载程序集往往会导致问题-请尝试使用此选项指定程序集:
typeof(IMessage).Assembly,typeof(MsmqTransportConfig).Assembly,typeof(IConfigureThisEndpoint.Assembly谢谢你的回答,Udi!让我更深入地解释一下:例如,我有两个插件在监听实体更新的消息。每个插件都有几个概要文件。当目标应用程序向插件发送实体更新消息时,我希望发生以下情况1。)插件1收到两条消息。每条消息都有相似的上下文,但注入了不同的概要文件。2.)插件2——相同。消息中注入配置文件数据的这一功能是我最近列表的职责。如果所有插件只有一条总线,我不知道如何实现这一点。
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();
}
}