【问题标题】:NserviceBus. How to start several buses in different AppDomains?服务总线。如何在不同的 AppDomain 中启动多条总线?
【发布时间】:2010-08-06 21:09:27
【问题描述】:

我想在一个进程中拥有多条总线。我对此进行了谷歌搜索,发现只有拥有多个 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();
    }
}

}

而且我没有调用处理程序。 如果您有任何想法,请提供帮助。我一直在与这个问题作斗争。 另外如果需要发布完整代码,请告知。

我需要几辆公共汽车来解决以下问题:

我有我的目标应用程序和几个插件。我们决定根据服务总线模式制作我们的插件。

每个插件可以有多个配置文件。

所以,目标应用程序(它是网络应用程序。)正在发布消息,其中发生了一些变化。订阅此消息的每个插件都需要为每个配置文件执行一些操作。但是插件对其配置文件一无所知(客户正在编写插件)。当消息处理开始时,插件应该只在其中注入配置文件。

我们决定有一些 RecepientList(模式在“企业集成模式”中描述),它知道插件配置文件,遍历它们并重新发送带有注入配置文件的消息。(因此,如果插件有多个配置文件,则多个消息将发送给它)。

但我不想在新进程中调用每个插件。完美地我想在启动期间为每个插件动态配置总线。全部在一个过程中。但似乎我需要在单独的 AppDomain 中执行此操作。所以我有一个上面描述的问题:-)。

【问题讨论】:

    标签: nservicebus


    【解决方案1】:

    谢尔盖,

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

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

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

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

    【讨论】:

    • 感谢您的回答,乌迪!让我更深入地解释一下:即我有两个插件正在监听 Entity Updated 消息。每个插件都有几个配置文件。当目标应用程序向插件发送实体更新消息时,我希望发生以下情况 1.) 插件 1 收到两条消息。每条消息都有相似的上下文,但注入了不同的配置文件。 2.) 插件 2 - 相同。消息中注入配置文件数据的这种功能是我的收件人列表的职责。如果所有插件只有一条总线,我看不出如何实现。
    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多