Ho una situazione seguente:NServiceBus - Come ottenere una coda separata per ogni tipo di messaggio destinatario del destinatario?
Quindi, il ricevitore sottoscrive due tipi di eventi: Eventa e eventB. NServiceBus crea la coda per il destinatario (Ricevitore) e inserisce i messaggi di tipo eventA e eventB nella stessa coda. La domanda è: se posso configurare NServiceBus per utilizzare code separate (ReceiverEventA e ReceiverEventB) per ciascun tipo di evento per il destinatario? Oppure posso avere due ricevitori in un singolo processo (e ciascuna coda separata del ricevitore). Il fatto è che EventA richiede molto più tempo per l'elaborazione rispetto a EventB e sono indipendenti, quindi se fossero in code separate, potrebbero essere elaborati contemporaneamente.
Aggiornamento: Se io vado con l'approccio ingenuo come questo, il ricevitore non riesce ad avviarsi con l'eccezione nullo di riferimento:
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());
}
eccezione dello stack trace è:
a NServiceBusTest2.WinFormsReceiver.Program .GetBusTHandler, TEvent in C: \ Users \ Utente \ Documenti \ Visual Studio 2010 \ Projects \ NServiceBusTest2 \ NServiceBusTest2.WinFormsReceiver \ Program.cs: riga 57
in NServiceBusTest2.WinFormsReceiver.Program.Main() in C: \ Users \ Utente \ Documenti \ Visual Studio 2 010 \ Projects \ NServiceBusTest2 \ NServiceBusTest2.WinFormsReceiver \ Program.cs: linea 26
a System.AppDomain._nExecuteAssembly (RuntimeAssembly assemblaggio, String [] args)
a System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [ ] args) a Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
a System.Threading.ThreadHelper.ThreadStart_Context (stato oggetto)
a System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback callback, oggetto di stato, booleano ignoreSyncCtx)
a System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback callback, Object state)
a System.Threading.ThreadHelper.ThreadStart()
Stavo pensando di lanciare a ThreadPool come elemento di lavoro, ma cosa succede se non riesce lì? Il gestore avrà finito il suo lavoro, quindi il messaggio verrà rimosso dalla coda e non c'è un modo standard per recuperarlo (o mi manchi qualcosa?). Stiamo usando Windows Form come strumento di gestione dei processi: ho citato un esempio più concreto qui: https://github.com/NServiceBus/NServiceBus/issues/219 – Giedrius
@Giedrius: aggiornamenti forniti nel corpo della risposta. –
Grazie per il vostro aiuto. Per rispondere alla tua domanda - WinForms è per avere una dashboard da mettere in pausa/riprendere, anche per vedere lo stato attuale dei canali di vendita - che è l'elaborazione. Abbiamo trovato un modo per avere più ricevitori utilizzando AppDomain separati, ma in generale è una soluzione dolorosa. Sembra che dovremo accettare la soluzione alternativa con AppDomains, sia la ricerca di un'alternativa per NServiceBus, sia la ridistribuzione della distribuzione (ora abbiamo cc.net + clickOnce) e abbiamo dashboard e gestori impostati come pezzi separati. – Giedrius