10
votes

Rabbitmq attends un message avec un délai d'attente

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.


0 commentaires

4 Réponses :


-1
votes

Il y a une question similaire. Bien que ce soit des réponses n'utilise pas Java, vous pouvez peut-être avoir des indices.

Attendez un seul message rabbbitmq avec un délai d'attente


0 commentaires

1
votes

com.rabbitmq.client.QueueEningConsumer a un NextDelivery (long timeout) 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.

Modifier pour ajouter: remarqué la date à ce sujet après avoir répondu!


0 commentaires

0
votes

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);


0 commentaires

3
votes

La bibliothèque client Java rabbbitmq Java maintenant prend en charge un argument de délai d'attente à son queueConsumer.nextDelive () méthode .

Par exemple, le Le tutoriel RPC utilise le code suivant: xxx

maintenant, vous pouvez utiliser consommateur.nextDelivery (1000) pour attendre une seconde maximale. Si le délai d'attente est atteint, la méthode renvoie null . xxx


0 commentaires