2015-10-01 1 views
1

J'essaie d'écouter la file d'erreurs pour traiter les messages ayant échoué, mais je n'arrive pas à faire en sorte que MassTransit ne mette pas les liens sur le message que je veux écouter dans la configuration. La configuration est ci-dessous et utilise v3 de MassTransit:Comment puis-je empêcher MassTransit de créer des liaisons d'échange pour les messages d'erreur?

var hostAddress = new Uri("rabbitmq://localhost/"); 
var username = "guest"; 
var password = "guest"; 

_busControl = MassTransit.Bus.Factory.CreateUsingRabbitMq(configurator => 
{ 
    var host = configurator.Host(hostAddress, h => 
    { 
    h.Username(username); 
    h.Password(password); 
    }); 

    configurator.ReceiveEndpoint(host, "myqueue_error", 
    endpointConfigurator => 
    { 
    endpointConfigurator.Handler<SomeMessage>(context => 
    { 
     return Console.Out.WriteLineAsync("Woop"); 
    }); 
    }); 
}); 

Dans l'exemple ci-dessus, il établira des liaisons pour tout ce qui publie SomeMessage et les diriger dans la myqueue_error que je ne veux que des messages allant dans à cette file qui a été transférée du service qui échoue. Y at-il de toute façon à consommer des messages d'une file d'attente mais dire à MassTransit de ne pas obtenir de bindings pour eux?

Mise à jour - Solution potentiel

Il semble que je ne ai pas besoin de configurer un ReceiveEndpoint mais je peux simplement renommer le ControlBus d'accepter le message que je me soucie, ce sera alors en mesure de traiter ces messages sans créer de liaison d'échange avec les messages.

est sous le code modifié, pas sûr si cela est un moyen idéal mais il fonctionne

var hostAddress = new Uri("rabbitmq://localhost/"); 
var username = "guest"; 
var password = "guest"; 

_busControl = MassTransit.Bus.Factory.CreateUsingRabbitMq(configurator => 
{ 
    configurator.Host(hostAddress, h => 
    { 
    h.Username(username); 
    h.Password(password); 
    }); 

    // We need to make the queue look like the error queue 
    configurator.BusQueueName = $"{_queue}_error"; 
    configurator.Durable = true; 
    configurator.AutoDelete = false; 
    configurator.SetQueueArgument("x-expires", null); 
}); 

var connectHandle = _busControl.ConnectHandler<SomeMessage>(context => Console.Out.WriteLineAsync("Woop")); 

_busHandle = _busControl.Start(); 

_busHandle.Ready.Wait(); 

// Wait 

// Clean up 

connectHandle.Disconnect(); 
_busHandle.Stop 

Répondre

1

De beaucoup de creuser autour j'ai trouvé une meilleure solution que je totalement manqué de la documentation .

Il semble que nous pouvons écouter les messages en abonnant les consommateurs à écouter Fault Cela fonctionne parfaitement pour ce que j'ai essayé d'atteindre et nous pouvons également garder les files d'attente d'erreur en virée. http://docs.masstransit-project.com/en/mt3/usage/exceptions.html#handling-exceptions

Ainsi, le dernier bit de configuration que je régle est la suivante:

var hostAddress = new Uri("rabbitmq://localhost/"); 
    var username = "guest"; 
    var password = "guest"; 

    _busControl = MassTransit.Bus.Factory.CreateUsingRabbitMq(configurator => 
    { 
     var host = configurator.Host(hostAddress, h => 
     { 
     h.Username(username); 
     h.Password(password); 
     }); 

     configurator.ReceiveEndpoint(host, "error_listener", 
     endpointConfigurator => 
     { 
     endpointConfigurator.Handler<Fault<SomeMessage>>(context => 
     { 
      return Console.Out.WriteLineAsync("Woop"); 
     }); 
     }); 
    });