J'aimerais envoyer un message à un serveur rabbbitmq, puis attendez un message de réponse (sur une file d'attente "Répondre à"). Bien sûr, je ne veux pas attendre pour toujours au cas où le traitement de l'application ces messages est en panne - il doit être un délai d'attente. Cela ressemble à une tâche très fondamentale, mais je ne peux pas trouver un moyen de faire cela. Je rencontre maintenant ce problème avec Java API. P>
4 Réponses :
Il y a une question similaire. Bien que ce soit des réponses n'utilise pas Java, vous pouvez peut-être avoir des indices. P>
Attendez un seul message rabbbitmq avec un délai d'attente a> p>
Modifier pour ajouter: remarqué la date à ce sujet après avoir répondu! p> com.rabbitmq.client.QueueEningConsumer code> a un
NextDelivery (long timeout) code> méthode, qui fera ce que vous voulez. Cependant, cela a été obsolète.
Ecrire votre propre délai d'attente n'est pas si difficile, bien qu'il soit préférable d'avoir un thread en cours et une liste d'identifiants à temps, plutôt que d'ajouter et d'éliminer les consommateurs et des threads d'expiration d'expiration associés tout le temps. p>
J'ai abordé ce problème à l'aide de C # en créant un objet pour garder une trace de la réponse à un message particulier. Il met en place une file d'attente de réponse unique pour un message et l'abonne. Si la réponse n'est pas reçue dans un délai 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 de mon fil principal (utilise un sémaphore) ou asynchrone (utilise un rappel) pour utiliser cette fonctionnalité.
Fondamentalement, la mise en œuvre ressemble à ceci: P>
//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 client Java rabbbitmq Java maintenant prend en charge un argument de délai d'attente à son queueConsumer.nextDelive () code> méthode
.
Par exemple, le Le tutoriel RPC utilise le code suivant: p> maintenant, vous pouvez utiliser consommateur.nextDelivery (1000) code> pour attendre une seconde maximale. Si le délai d'attente est atteint, la méthode renvoie
null code>. P>