NserviceBus。如何在不同的AppDomain中启动多个总线?

时间:2010-08-06 12:44:37

标签: nservicebus

我希望在一个过程中有几个总线。我搜索了这个,发现只有拥有多个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中执行此操作。所以我遇到了上述问题: - )。

1 个答案:

答案 0 :(得分:1)

塞吉,

我不清楚为什么每个插件都需要有自己的总线。他们都不能坐在同一辆公共汽车上吗?每个插件开发人员都会像以前一样编写他们的消息处理程序,订阅将由总线自动发生。

然后,您也不需要指定加载每个NServiceBus DLL。

顺便说一句,按名称加载程序集往往会导致问题 - 尝试使用它来指定程序集:

typeof(IMessage).Assembly,typeof(MsmqTransportConfig).Assembly,typeof(IConfigureThisEndpoint).Assembly