2017-08-24 3 views
1

Je suis incapable de récupérer l'objet une fois que je l'ai ajouté à la file d'attente, le code pour l'ajouter est le suivant, cela fonctionne bien pour autant que je puisse voir le message La queue.Rebus RabbitMq Impossible de s'abonner et d'extraire l'article

var connection = "amqp://name:[email protected]"; 
using (var activator = new BuiltinHandlerActivator()) 
{ 
    Configure.With(activator) 
     .Logging(l => l.ColoredConsole()) 
     .Transport(t => t.UseRabbitMqAsOneWayClient(connection).ExchangeNames(directExchangeName: "WamosExchange")) // .ExchangeNames(directExchangeName: "WamosExchange") 
     .Routing(r => r.TypeBased() 
      .Map<Wagon>("wagon_v1")) 
     .Start(); 

    var wagon = new Wagon 
    { 
     Token = Guid.Parse("3CCE443C-249F-4FD2-9882-5830FB308B6B"), 
     WagonId = Guid.Parse("A98A06AB-33B9-4A11-9DE2-DF0B8787B713"), 
     Description = "test", 
     WamosId = 12324, 
     YearBuilt = 1982 
    }; 

    await activator.Bus.Send(wagon); 

    Console.WriteLine("Done"); 
} 

Le code pour la récupérer est la suivante (cela ne fonctionne pas). J'utilise un échange dans RabbitMq qui utilise la file d'attente wagon_v1. Je vois que rebus crée l'autre en rouge. tout un peu confus. Je veux qu'il utilise le WamosExchange avec la file d'attente wagon_v1.

enter image description here

static BuiltinHandlerActivator activator = new BuiltinHandlerActivator(); 

static async Task MainSubscribeAsync() 
{ 

    var connection = "amqp://name:[email protected]"; 

    activator.Register(() => new WagonHandler()); 

    var bus = Configure.With(activator) 
     .Logging(l => l.ColoredConsole()) 
     .Transport(t => t.UseRabbitMq(connection, "wagon_v1") 
      .ExchangeNames(directExchangeName: "WamosExchange")) 
     .Routing(r => r.TypeBased() 
      .Map<Wagon>("wagon_v1")) 
     .Options(o => 
     { 
      o.SetMaxParallelism(10); 
      o.SetNumberOfWorkers(10); 
     }) 
     .Start(); 

    await bus.Subscribe<Wagon>(); 

    Console.WriteLine("Done"); 
} 

Le gestionnaire est comme suit:

class WagonHandler : IHandleMessages 
{ 
    public void Handle(Wagon message) 
    { 
     Console.WriteLine($"Token {message.Token}"); 
     Console.WriteLine($"WagonId {message.WagonId}"); 
    } 
} 

Je reçois juste cette erreur lorsque vous essayez de souscrire

Rebus.Retry.ErrorTracking.InMemErrorTracker WARN (Rebus 1 worker 4): Unhandled exception 1 while handling message with ID "f26daec4-48e2-47ca-a3fe-b4f18bc9b217" 
Rebus.Retry.ErrorTracking.InMemErrorTracker WARN (Rebus 1 worker 2): Unhandled exception 2 while handling message with ID "f26daec4-48e2-47ca-a3fe-b4f18bc9b217" 
Rebus.Retry.ErrorTracking.InMemErrorTracker WARN (Rebus 1 worker 8): Unhandled exception 3 while handling message with ID "f26daec4-48e2-47ca-a3fe-b4f18bc9b217" 
Rebus.Retry.ErrorTracking.InMemErrorTracker WARN (Rebus 1 worker 7): Unhandled exception 4 while handling message with ID "f26daec4-48e2-47ca-a3fe-b4f18bc9b217" 
Rebus.Retry.ErrorTracking.InMemErrorTracker WARN (Rebus 1 worker 6): Unhandled exception 5 while handling message with ID "f26daec4-48e2-47ca-a3fe-b4f18bc9b217" 
Rebus.Retry.PoisonQueues.PoisonQueueErrorHandler ERROR (Rebus 1 worker 5): Moving message with ID "f26daec4-48e2-47ca-a3fe-b4f18bc9b217" to error queue "error" 
System.AggregateException: 5 unhandled exceptions ---> Rebus.Exceptions.RebusApplicationException: Message with ID f26daec4-48e2-47ca-a3fe-b4f18bc9b217 and type ThreeSquared.VTGPAM.Objects.Wagon, ThreeSquared.VTGPAM.Objects could not be dispatched to any handlers 
    at Rebus.Pipeline.Receive.DispatchIncomingMessageStep.<Process>d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 

Répondre

1

Comme l'indique le message d'erreur, un gestionnaire de messages qui gère Wagon n'a pas pu être trouvé.

Votre gestionnaire

class WagonHandler : IHandleMessages 
{ 
    public void Handle(Wagon message) 
    { 
     Console.WriteLine($"Token {message.Token}"); 
     Console.WriteLine($"WagonId {message.WagonId}"); 
    } 
} 

ne peut pas être trouvé par Rebus parce qu'il recherche des implémentations de IHandleMessages<Wagon>, et que vous avez simplement utilisé l'interface de base IHandleMessages.

La mise en œuvre IHandleMessages<Wagon> exige que vous modifiez légèrement la signature de la méthode - il devrait ressembler à ceci:

class WagonHandler : IHandleMessages<Wagon> 
{ 
    public async Task Handle(Wagon message) 
    { 
     Console.WriteLine($"Token {message.Token}"); 
     Console.WriteLine($"WagonId {message.WagonId}"); 
    } 
}