NserviceBus. Как запустить несколько шин в разных AppDomains?

Я хочу иметь несколько шин в одном процессе. Я погуглил об этом и обнаружил, что это возможно только при наличии нескольких доменов приложений. Но я не могу заставить его работать.

Вот мой пример кода (я делаю все в одной библиотеке классов):

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();
    }
}

}

И у меня не вызывается обработчик. Если у вас есть какие-либо идеи, пожалуйста, помогите. Я борюсь с этой проблемой много времени. Также, если необходимо опубликовать полный код, сообщите об этом.

Мне нужно несколько автобусов, чтобы решить следующую задачу:

У меня есть целевое приложение и несколько плагинов к нему. Мы решили сделать наши плагины по шаблону служебной шины.

Каждый плагин может иметь несколько профилей.

Итак, целевое приложение (это веб-приложение) публикует сообщение о том, что в нем что-то изменилось. Каждый плагин, который подписан на это сообщение, должен выполнить какое-то действие для каждого профиля. Но плагин ничего не знает о своих профилях (клиенты пишут плагины). Плагин должен иметь только профиль, введенный в него, когда начинается обработка сообщений.

Мы решили создать некий RecipientList (паттерн описан в «Шаблонах интеграции предприятия»), который знает о профилях плагинов, перебирает их и повторно отправляет сообщения с внедренными профилями. Это).

Но я не хочу, чтобы каждый плагин вызывался в новом процессе. Отлично хочу динамически настраивать шины для каждого плагина во время запуска. Все в одном процессе. Но, похоже, мне нужно сделать это в отдельных AppDomains. Итак, у меня проблема, описанная выше :-).


person struhtanov    schedule 06.08.2010    source источник


Ответы (1)


Сергей,

Мне непонятно, почему у каждого плагина должна быть своя шина. Разве они не могли сесть в один автобус? Каждый разработчик плагинов будет писать свои обработчики сообщений, как и раньше, а подписки будут происходить автоматически по шине.

Тогда вам также не нужно было бы загружать каждую из DLL NServiceBus.

Кстати, загрузка сборки по имени может вызвать проблемы — попробуйте использовать это для указания сборок:

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

person Udi Dahan    schedule 06.08.2010
comment
Спасибо за ответ, Уди! Позвольте мне объяснить немного глубже: т.е. у меня есть два плагина, прослушивающие сообщение Entity Updated. Каждый плагин имеет несколько профилей. Когда целевое приложение отправляет сообщение Entity Updated плагинам, я хочу, чтобы произошло следующее: 1.) Плагин 1 получает два сообщения. Каждое сообщение имеет схожий контекст, но вводятся разные профили. 2.) Плагин 2 -- то же самое. И эта функциональность данных профиля инъекции в сообщении является обязанностью моего списка получателей. Я не понимаю, как это можно реализовать, если на все плагины будет одна шина. - person struhtanov; 09.08.2010