Je souhaite envoyer un message à un serveur RabbitMQ, puis attendre un message de réponse (dans une file d'attente de "réponse à"). Bien sûr, je ne veux pas attendre indéfiniment dans le cas où l'application traitant ces messages est en panne - il doit y avoir un délai d'expiration. Cela semble être une tâche très basique, mais je ne trouve pas de moyen de le faire. J'ai maintenant rencontré ce problème avec l'API Java.RabbitMQ Attendre un message avec un délai d'expiration
Répondre
Il existe une question similaire. Bien que ses réponses n'utilisent pas Java, peut-être que vous pouvez obtenir quelques conseils.
com.rabbitmq.client.QueueingConsumer
a une méthode nextDelivery(long timeout)
, qui fera ce que vous voulez. Cependant, cela a été déprécié. L'écriture de votre propre délai d'attente n'est pas si difficile, bien qu'il soit préférable d'avoir un thread continu et une liste d'identifiants en temps réel, plutôt que d'ajouter et de supprimer des consommateurs et des threads de timeout associés tout le temps.
Editer pour ajouter: A noté la date sur ce après avoir répondu!
J'ai abordé ce problème en utilisant C# en créant un objet pour garder une trace de la réponse à un message particulier. Il configure une file d'attente de réponse unique pour un message et s'y abonne. Si la réponse n'est pas reçue dans un laps de temps spécifié, un compte à rebours annule l'abonnement, ce qui supprime la file d'attente. Séparément, j'ai des méthodes qui peuvent être synchrones à partir de mon thread principal (utilise un sémaphore) ou asynchrone (utilise un rappel) pour utiliser cette fonctionnalité.
Fondamentalement, la mise en œuvre ressemble à ceci:
//Synchronous case:
//Throws TimeoutException if timeout happens
var msg = messageClient.SendAndWait(theMessage);
//Asynchronous case
//myCallback receives an exception message if there is a timeout
messageClient.SendAndCallback(theMessage, myCallback);
La bibliothèque cliente Java RabbitMQ maintenant supports a timeout argument to its QueueConsumer.nextDelivery()
method.
Par exemple, le tutoriel RPC utilise le code suivant:
channel.basicPublish("", requestQueueName, props, message.getBytes());
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
if (delivery.getProperties().getCorrelationId().equals(corrId)) {
response = new String(delivery.getBody());
break;
}
}
Maintenant, vous pouvez utiliser consumer.nextDelivery(1000)
attendre au maximum une seconde. Si le délai d'expiration est atteint, la méthode renvoie null
.
channel.basicPublish("", requestQueueName, props, message.getBytes());
while (true) {
// Use a timeout of 1000 milliseconds
QueueingConsumer.Delivery delivery = consumer.nextDelivery(1000);
// Test if delivery is null, meaning the timeout was reached.
if (delivery != null &&
delivery.getProperties().getCorrelationId().equals(corrId)) {
response = new String(delivery.getBody());
break;
}
}
- 1. Message retardé dans RabbitMQ
- 2. Comment faire pour rétracter un message dans RabbitMQ?
- 3. Attendre un message de fenêtre pendant une durée définie
- 4. Message Rabbitmq différencier avec l'ID de message basé sur Java API
- 5. Délai d'acquittement de message JMS?
- 6. django-céleri sans un serveur amqp (rabbitmq)
- 7. requeue un travail de sweatshop dans RabbitMQ
- 8. Réception de message RabbitMQ plus lent que la publication
- 9. C#, introduire un délai DragOver
- 10. ADO.NET: interroger un DataTable sur un délai
- 11. RabbitMQ échange de messages
- 12. action après un délai
- 13. jQuery - Traverser en continu avec un délai
- 14. Transactions RabbitMQ et DB
- 15. un message synchronisé avec nservicebus
- 16. booster static_assert avec un message?
- 17. problème avec m'envoyer un message
- 18. mvc redirigent après un délai
- 19. WPF mettre à jour l'interface utilisateur avec un certain délai
- 20. C# faire un événement attendre
- 21. comment définir les propriétés de message de base pour le message dans Rabbitmq?
- 22. Comment forcer un délai d'expiration d'Emacs?
- 23. Pourquoi ils ont créé un délai
- 24. workling & RabbitMQ
- 25. Demander un délai d'expiration
- 26. Phusion Passenger + Workling + RabbitMQ
- 27. fenêtre Délai ouvert sur un clic avec JQuery
- 28. Cibler un iframe avec un message HTML avec jQuery
- 29. File d'attente simple avec Celery et RabbitMQ
- 30. Attendre un iframe pour ouvrir et charger avec Selenium