que tienen un siguiente situación:NServiceBus: ¿cómo obtener una cola separada para cada tipo de mensaje que el receptor suscribe?
Por lo tanto, el receptor se suscribe a dos tipos de eventos: Eventa y eventB. NServiceBus crea la cola para el receptor (Receptor) y coloca mensajes de tipo eventA y eventB en la misma cola. La pregunta es si puedo configurar NServiceBus para usar colas separadas (ReceiverEventA y ReceiverEventB) para cada tipo de evento para el receptor. O puedo tener dos receptores en un solo proceso (y cada receptor en cola separada). La cosa es que EventA tarda mucho más en procesarse que EventB, y son independientes, por lo que si estuvieran en colas separadas, podrían procesarse simultáneamente.
Actualización: Si voy con enfoque ingenuo de esta manera, el receptor no puede iniciarse con excepción de referencia nula:
private static IBus GetBus<THandler, TEvent>()
{
var bus = Configure.With(new List<Type>
{
typeof(THandler),
typeof(TEvent),
typeof(CompletionMessage)
})
.Log4Net()
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(true)
.PurgeOnStartup(false)
.UnicastBus()
.LoadMessageHandlers()
.ImpersonateSender(false);
bus.Configurer.ConfigureProperty<MsmqTransport>(x => x.InputQueue, "Queue" + typeof(THandler).Name);
return bus.CreateBus().Start();
}
[STAThread]
static void Main()
{
Busses = new List<IBus>
{
GetBus<ItemEventHandlerA, ItemEventA>(),
GetBus<ItemEventHandlerB, ItemEventB>()
};
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TestForm());
}
Excepción seguimiento de la pila es:
en NServiceBusTest2.WinFormsReceiver.Program .GetBusTHandler, TEvent en C: \ Users \ User \ Documents \ Visual Studio 2010 \ Projects \ NServiceBusTest2 \ NServiceBusTest2.WinFormsReceiver \ Program.cs: línea 57
en NServiceBusTest2.WinFormsReceiver.Program.Main() en C: \ Users \ Usuario \ Documentos \ Visual Studio 2 010 \ Projects \ NServiceBusTest2 \ NServiceBusTest2.WinFormsReceiver \ Program.cs: línea 26
en System.AppDomain._nExecuteAssembly (montaje RuntimeAssembly, args String [])
en System.AppDomain.ExecuteAssembly (String assemblyFile, assemblySecurity Evidencia, String [ ] args) en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
en System.Threading.ThreadHelper.ThreadStart_Context (estado Object)
en System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback devolución de llamada, objeto de estado, Boolean ignoreSyncCtx)
en System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, estado del objeto)
en System.Threading.ThreadHelper.ThreadStart()
Estaba pensando en tirar a ThreadPool como un elemento de trabajo, pero ¿y si falla allí? Handler terminará su trabajo, por lo que se eliminará el mensaje de la cola y no hay una forma estándar de recuperarlo (¿o me falta algo?). Estamos utilizando formularios de Windows como una herramienta de gestión de procesos. He mencionado un ejemplo más concreto aquí: https://github.com/NServiceBus/NServiceBus/issues/219 – Giedrius
@Giedrius: proporcioné actualizaciones en el cuerpo de la respuesta. –
Gracias por su ayuda. Para responder a su pregunta: WinForms es para tener un tablero de instrumentos para pausar/reanudar, también para ver el estado actual de los canales de venta, que es qué procesamiento. Encontramos la forma de tener varios receptores usando AppDomains por separado, pero en general es una solución dolorosa. Parece que tendremos que aceptar soluciones con AppDomains, buscar alternativas para NServiceBus, reconsiderar la implementación (ahora tenemos cc.net + clickOnce) y tener el tablero y los manejadores configurados como piezas separadas. – Giedrius