Я хочу иметь несколько шин в одном процессе. Я погуглил об этом и обнаружил, что это возможно только при наличии нескольких доменов приложений. Но я не могу заставить его работать.
Вот мой пример кода (я делаю все в одной библиотеке классов):
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. Итак, у меня проблема, описанная выше :-).