2017-10-17 8 views
0

Je veux créer une file d'attente avec RabbitMq où je vais envoyer des messages d'un côté et recevoir dans une autre application. Je suis le faire avec le code suivant:Confondu par Masstransit ReceiveFrom méthode et le comportement du consommateur

return ServiceBusFactory.New(x => 
     { 
      var uriString = string.Format(@"rabbitmq://{0}/{1}/{2}?prefetch={3}", host, virtualHost, queueName, 
       prefetch < 1 ? 1 : prefetch); 
      x.UseRabbitMq(r => r.ConfigureHost(new MessageUrn(uriString), h => 
      { 
       h.SetUsername(user); 
       h.SetPassword(password); 
       h.SetRequestedHeartbeat(3); 

      })); 

      x.ReceiveFrom(uriString); 

      x.UseJsonSerializer<ServiceBusConfigurator>(); 

      f(x); 
     }); 

MessageUrn uri et ReceiveFrom doivent avoir la même uri, sinon uri spécifié pour la méthode ReceiveFrom déterminer point final de bus. Mais cela signifie que mon éditeur est également consommateur de la même file d'attente. Lorsqu'il n'y a pas de récepteur, tous les messages sont placés dans la file d'attente queuename_error. Quand il y a un récepteur, tout semble aller bien.

Qu'est-ce que je fais mal? Je comprends pourquoi les messages vont dans la file d'attente d'erreurs - parce que l'éditeur n'est pas abonné à eux mais en même temps il est un consommateur, d'où la situation d'erreur . Est-il possible de récupérer des messages à partir de la file d'erreurs, lorsque le récepteur est (re) démarré?

masstransit est 2.10.0.0.

Merci d'avance.

+0

Je vous suggère de mettre à jour masstransit vers la version <= 3.0.0, il a une meilleure API. Voici la documentation pour masstransit v3 et plus: http://masstransit-project.com/MassTransit/ –

+0

Je ne peux pas utiliser les versions ultérieures. – Sharov

Répondre

2

L'adresse .ReceiveFrom() doit être unique pour chaque service et partagée uniquement lorsque les services ont les mêmes consommateurs avec les mêmes types de message en cours de consommation. La seule chose commune entre les services utilisant le même serveur RabbitMQ est l'hôte (et l'hôte virtuel, s'il est utilisé). Sinon, ils doivent être différents.

Et oui, ils vont dans la file d'erreurs parce que l'éditeur n'est pas abonné à eux. Donnez à votre éditeur un nom de file d'attente différent et le problème est résolu.

+0

Merci pour votre réponse. Pourtant, je ne peux pas l'obtenir - pourquoi devrais-je spécifier ReceiveFrom() si je veux seulement envoyer des messages? Pourquoi uri dans la méthode ConfigureHost n'est pas suffisant? En outre, lorsque je spécifie une chaîne uri différente (une pour ConfigureHost et une pour ReceiveFrom), les messages seront envoyés à la file d'attente spécifiée par la méthode ReceiveFrom. Assez étrange ... – Sharov

+0

C'est un artefact de l'âge et de l'évolution de l'API v2. L'API V3 est beaucoup plus logique, mais vous avez dit que vous ne pouvez pas mettre à niveau, donc, vous êtes coincé avec elle. –

+0

Si v3 peut aider à éviter cela, je vais essayer de migrer. Je suppose que c'est spécifique au RMQ. – Sharov