Desidero inviare un messaggio a un server RabbitMQ e quindi attendere un messaggio di risposta (in una coda "reply-to"). Certo, non voglio aspettare per sempre nel caso in cui l'applicazione che elabora questi messaggi sia inattiva - deve esserci un timeout. Sembra un compito molto semplice, ma non riesco a trovare un modo per farlo. Ora ho incontrato questo problema con l'API Java.RabbitMQ Attendere un messaggio con un timeout
risposta
C'è una domanda simile. Anche se le sue risposte non usano java, forse puoi avere qualche suggerimento.
com.rabbitmq.client.QueueingConsumer
ha un metodo nextDelivery(long timeout)
, che farà quello che vuoi. Tuttavia, questo è stato deprecato. Scrivere il proprio timeout non è così difficile, anche se potrebbe essere meglio avere un thread in corso e un elenco di identificatori in tempo, piuttosto che aggiungere e rimuovere utenti e thread di timeout associati per tutto il tempo.
Modifica per aggiungere: annotato la data su questo dopo aver risposto!
Mi sono avvicinato a questo problema utilizzando C# creando un oggetto per tenere traccia della risposta a un particolare messaggio. Imposta una coda di risposta univoca per un messaggio e si abbona ad essa. Se la risposta non viene ricevuta in un intervallo di tempo specificato, un timer per il conto alla rovescia annulla la sottoscrizione, che elimina la coda. Separatamente, ho metodi che possono essere sincroni dal mio thread principale (usa un semaforo) o asincroni (usa un callback) per utilizzare questa funzionalità.
In sostanza, l'applicazione si presenta così:
//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 libreria client Java ora RabbitMQ supports a timeout argument to its QueueConsumer.nextDelivery()
method.
Per esempio, il tutorial RPC utilizza il seguente codice:
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;
}
}
Ora, è possibile utilizzare consumer.nextDelivery(1000)
per attendere al massimo un secondo. Se viene raggiunto il timeout, il metodo restituisce 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. Come svanire un messaggio dopo un timeout
- 2. Come impostare il rilevamento del timeout su un server RabbitMQ?
- 3. GetMessage con un timeout
- 4. RabbitMQ 3.5 e priorità messaggio
- 5. asincrono attendere Task <T> completare con timeout
- 6. RabbitMQ consuma un messaggio se esiste e chiude
- 7. RabbitMQ heartbeat vs timeout connessione drain time
- 8. RabbitMQ C# API evento basato Messaggio Consumo
- 9. Come eseguire un processo con un timeout in Bash?
- 10. Permettere un gen_fsm al timeout se riceve nessun messaggio
- 11. Rabbitmq timestamp messaggio orario di arrivo
- 12. Set Messaggio TTL ad una RabbitMQ un'ora
- 13. Attendere sincrono messaggio in Web-Worker
- 14. Come visualizzare un messaggio "Caricamento in corso ... attendere" in Winforms per un lungo modulo di caricamento?
- 15. Invia un oggetto utilizzando RabbitMQ
- 16. C# attendere un eco sulla porta seriale, controllarlo e attendere un attimo sull'attesa
- 17. Akka Actor - aspetta un po 'di tempo per aspettare un messaggio, altrimenti invia un messaggio
- 18. RabbitMQ ascolta solo il primo messaggio in coda
- 19. I messaggi del messaggio RabbitMQ smettono di consumare messaggi
- 20. JDBC postazione query con un timeout
- 21. Riprovare un comando Bash con timeout
- 22. RabbitMQ con nodejs
- 23. C++ Boost ASIO: come leggere/scrivere con un timeout?
- 24. PHP: Invia un messaggio di rete UDP, e attendere la risposta
- 25. Come fare un attore di scala 'attendere il segnale' ma non perdere nessun messaggio?
- 26. RabbitMQ chiama la funzione di callback per un utente quando ha qualche messaggio?
- 27. Pubblica più messaggi su RabbitMQ da un file
- 28. Socket.IO con RabbitMQ?
- 29. Utilizzo di librerie JMS esistenti con un broker AMQP (RabbitMQ)
- 30. Utilizzo di restTemplate di sping con un timeout, come posso rilevare un timeout?