2015-08-31 1 views
0

Oui, nous pouvons utiliser la fonctionnalité de souscription automatique et la méthode d'abonnement normale avec cet ID d'abonnement, mais cette solution est très laide dans les files d'attente et les échanges RMQ. Il était difficile de suivre et d'analyser les messages. J'utilise le bus avancé et crée mes propres échanges et files d'attente. J'ai publié avec succès mais la partie consommatrice est un peu décevante. Actuellement, il utilise de cette façon:EasyNetQ - Message consommé par IAdvanceBus par un message non générique

IAdvanceBus = bus.Advanced.Consume(queueName, registration => 
{ 
    registration.Add<MESSAGE1>((message, info) => { ProcessMessage(MESSAGE1) }) 
    registration.Add<MESSAGE2>((message, info) => { ProcessMessage(MESSAGE2) }) 
    registration.Add<MESSAGE3>((message, info) => { ProcessMessage(MESSAGE3) }) 
    registration.Add<MESSAGE4>((message, info) => { ProcessMessage(MESSAGE4) }) 
    registration.Add<MESSAGE5>((message, info) => { ProcessMessage(MESSAGE5) }); 
}); 

Ceci est bon mais le problème si vous avez une centaine d'auditeurs?

J'ai vérifié le type d'enregistrement IHandlerRegistration il utilise seulement un générique, peut-on avoir la manière non générique?

Comme:

IAdvanceBus = bus.Advanced.Consume(queueName, registration => 
{ 
    registration.Add(typeof(MESSAGE1), info => { ProcessMessage(MESSAGE1) })  
    registration.Add(typeof(MESSAGE2), info => { ProcessMessage(MESSAGE2) })  
    registration.Add(typeof(MESSAGE3), info => { ProcessMessage(MESSAGE3) })  
}); 

De cette façon, nous pouvons analyser l'ensemble qui utilise ces messages.

Dans un autre côté, je me inscrire via la construction de bus:

RabbitHutch.CreateBus(connectionString, registeredServices => { 
IEasyNetQLogger logger; 
MyCustomHandlerCollection myHandlers = myDIContainer.Resolve<IMyHandlers>(); 

registeredServices.Register<IHandlerCollection>(s => 
{ 
    logger = s.Resolve<IEasyNetQLogger>(); 
    return myHandlers; 
}); 
registeredServices.Register<IHandlerRegistration>(s => myHandlers});}); 

Mais ce ne respectant pas mon regisration parce que quand je vois le code de bus avance la consommation: consume code crée de l'usine et ne lit pas du contenant. Je crois que c'est une cause profonde.

Répondre

0

Pour contourner cette exigence, j'utilisé cette méthode de IAdvanceBus:

IDisposable Consume(IQueue queue, Func<byte[], MessageProperties, MessageReceivedInfo, Task> onMessage); 

Je roulais mon propre répartiteur de message et deserialize tout message de la file d'attente. Le répartiteur de collection déterminera le type de message et l'envoi à un gestionnaire spécifique créé en utilisant la réflexion.