RabbitMQ: Comment spécifier la file d'attente à publier?
RabbitMQ est Channel#basicConsume
méthode nous donne les arguments suivants:
channel.basicConsume(queueName, autoAck, consumerTag, noLocal,
exclusive, arguments, callback);
Nous donnant la capacité à dire RabbitMQ exactement file d'attente à laquelle nous voulons consommer de.
Mais Channel#basicPublish
n'a pas une telle équivalence:
channel.basicPublish(exchangeName, routingKey, mandatory, immediateFlag,
basicProperties, messageAsBytes);
Pourquoi je ne peux pas spécifier la file d'attente de publier ici?!? Comment puis-je obtenir un Channel
publier à, disons, une file d'attente nommé logging
? Merci à l'avance!
- Ce que vous voulez faire peut être fait avec exclusif de la file d'attente, avec échange direct et connu nom de file d'attente et en quelque sorte avec itinéraire précis clé + sujet d'échange.
- Merci @zaq178miami (+1) - pouvez-vous fournir un exemple de code?
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, les files d'attente peuvent être liées à un échange basé sur routingKeys.
Supposons que vous avez 3 éditeurs différents.
Publisher1 l'envoi de message à l'échange avec routingKey "événements"
Publisher2 l'envoi de message à l'échange avec routingKey "tâches"
Publisher3 l'envoi de message à l'échange avec routingKey "emplois"
Vous pouvez avoir un consommateur qui consomme seulement des messages spécifiques routhingKey.
Par exemple, afin d'avoir un consommateur pour les "événements" des messages de vous déclarer comme ceci
Si vous voulez consommer tous les messages provenant de l'échange de vous donner le routage comme '#'
Donc en bref ce que je peux dire, c'est,
1. Les Messages seront publiés à un échange.
2. Les files d'attente seront tenus d'échange basé sur routingKeys.
3. RabbitMQ transmettra les messages avec la correspondance des touches de routine à la correspondante de files d'attente.
Veuillez consulter le didacticiel - http://www.rabbitmq.com/tutorials/tutorial-three-java.html
L'idée de base dans la messagerie de modèle dans RabbitMQ est que le producteur n'envoie jamais de messages directement à une file d'attente. En fait, très souvent, le producteur ne sait même pas si un message sera livré à la file d'attente à tous. Au lieu de cela, le producteur ne peut envoyer des messages à un échange
Étendre sur @Tien Nguyen réponse, il existe un "cheat" dans RabbitMQ effectivement qui vous permet de publier directement à une file d'attente. Chaque file d'attente est automatiquement liée à la AMQP exchange par défaut, avec la file d'attente du nom que la clé de routage. La valeur par défaut de change est également connu comme le "nameless exchange" - c'est à dire son nom est une chaîne de caractères vide. Donc, si vous publiez à l'échange nommé
""
avec clé de routage correspondant à votre file d'attente du nom, le message sera envoyé à cette file d'attente. Il passe par un échange comme @John a dit, il est tout simplement pas celui que vous avez besoin de déclarer ou de vous lier.Je n'ai pas le client Java pratique pour tester ce code, mais il devrait fonctionner.
Cela dit, c'est surtout contraire à l'esprit de la façon dont RabbitMQ œuvres. Pour l'application normale flux que vous devez déclarer et de se lier d'échanges. Mais pour des cas exceptionnels, le "cheat" peut être utile. Par exemple, je crois que c'est la façon dont le Lapin Console d'administration vous permet de publier des messages dans une file d'attente sans toute la cérémonie, de la création et de liaison des échanges.
veuillez essayer ceci:
Travaillé pour mon projet.
basicPublish(java.lang.String exchange, java.lang.String routingKey, AMQP.BasicProperties props, byte[] body)
la surcharge debasicPublish
. En surcharge, le 2e paramètre (que vous avez comme "yourQueueName" est appelé "routingKey". Donc, est "routingKey" RabbitMQ lingo pour "nom de file d'attente"?