2017-04-26 1 views
1

Je suis très novice chez rebus.Rebus arrête de récupérer les messages du bus de service azure. À partir de 100 messages seulement 5 Je pouvais aller chercher

J'ai construit l'exemple pub/sub à partir de zéro. Maintenant, je reçois des messages dans mon abonné. Le problème que je suis confronté est que je publie 100 messages et soudainement quand je démarre le service d'abonné il obtient seulement 5 de ces 100 messages.

Le service Windows effectue la tâche asynchrone 5 fois, puis s'éteint. Est-ce que je fais quelque chose de mal?

Ma configuration d'abonné ressemble à ceci:

using (var activator = new BuiltinHandlerActivator()) { 
    activator.Register(() => new TestMessageHandler()); 

    Configure.With(activator) 
     .Transport(t => t.UseAzureServiceBus(Constants.connectionString, Constants.subQueue)) 
     .Routing(r => r.TypeBased().MapAssemblyOf<TestMessage>(Constants.pubQueue)‌​) 
     .Start(); 

    activator.Bus.Subscribe<TestMessage>().Wait(120000); 
} 

et mon gestionnaire ressemble à ceci:

public async Task Handle(TestMessage message) { 
    var message = string.Format("name: {1} and source name {2} {0} using the warp as a transport {0}", Environment.NewLine, message.Name , message.SourceName); 

    await Task.Run(() => Logger(message)); 
} 

private void Logger(TestMessage message) { 
    Console.WriteLine(message.ToString(false)); 
} 

À partir du code que j'ai posté, est-il quelque chose que je fait de mal?

+0

Pouvez-vous essayer et montrer le code dans votre abonné? – mookid8000

+0

Bonjour, merci pour la réponse rapide. Voici mon code. – hfpg2001

+0

en utilisant (var activateur = new BuiltinHandlerActivator()) { activator.Register (() => new TestMessageHandler()); Configure.With (activateur) .Transport (t => t.UseAzureServiceBus (Constants.connectionString, Constants.subQueue)) .Routing (r => r.TypeBased(). MapAssemblyOf (Constants.pubQueue)) .Début(); activateur.Bus.Souscrire () .Attendre (120000); } – hfpg2001

Répondre

0

À partir du code

using (var activator = new BuiltinHandlerActivator()) { 
    (...) 
    activator.Bus.Subscribe<TestMessage>().Wait(120000); 
} 

il semble que votre abonné presque immédiatement disposer le activator et ainsi arrêter le bus.

Cette hypothèse correspond parfaitement au comportement que vous rencontrez lorsque seuls les premiers messages de la file d'attente sont traités. Vous devez conserver l'instance de l'activateur (ou la IBus renvoyée si vous préférez) en tant que singleton pendant toute la durée d'exécution de votre application, puis la disposer à l'arrêt.

+0

Merci, @mookid, mais je pensais que l'attente attendrait jusqu'à ce que la file d'attente soit vide ... n'est pas? – hfpg2001

+0

Non, ce n'est pas comme ça que ça fonctionne ... Rebus est destiné à être démarré et conservé pendant toute la durée de fonctionnement de votre application, et il traitera les messages aussi longtemps qu'il est en cours d'exécution. de sorte qu'il est parfaitement correct de l'arrêter à tout moment, même si beaucoup plus de messages résident dans la file d'attente, si par ex. vous voulez mettre à jour votre système ou autre chose ...juste pour reprendre le traitement du message lorsque vous le redémarrez – mookid8000