Me gustaría enviar un mensaje a un servidor RabbitMQ y luego esperar un mensaje de respuesta (en una cola de "respuesta a"). Por supuesto, no quiero esperar para siempre en caso de que la aplicación que está procesando estos mensajes no funcione, debe haber un tiempo de espera. Parece una tarea muy básica, pero no puedo encontrar la forma de hacerlo. Ahora me he encontrado con este problema con la API de Java.RabbitMQ Espere un mensaje con un tiempo de espera
Respuesta
Hay una pregunta similar. Aunque sus respuestas no usan Java, tal vez puedas obtener algunas pistas.
com.rabbitmq.client.QueueingConsumer
tiene un método nextDelivery(long timeout)
, que va a hacer lo que quiere. Sin embargo, esto ha sido desaprobado. Escribir su propio tiempo de espera no es tan difícil, aunque puede ser mejor tener un hilo continuo y una lista de identificadores en tiempo, en lugar de agregar y quitar los consumidores y los hilos de tiempo de espera asociados todo el tiempo.
Editar para añadir: ¡Ha notado la fecha después de responder!
Abordé este problema usando C# creando un objeto para realizar un seguimiento de la respuesta a un mensaje en particular. Configura una cola de respuesta única para un mensaje y se suscribe a ella. Si la respuesta no se recibe en un marco de tiempo específico, un temporizador de cuenta regresiva cancela la suscripción, que elimina la cola. Por separado, tengo métodos que pueden ser sincrónicos desde mi hilo principal (usa un semáforo) o asincrónico (utiliza una devolución de llamada) para utilizar esta funcionalidad.
Básicamente, la puesta en práctica se parece a esto:
//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 biblioteca cliente Java ahora RabbitMQ supports a timeout argument to its QueueConsumer.nextDelivery()
method.
Por ejemplo, el tutorial RPC utiliza el siguiente código:
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;
}
}
Ahora, puede utilizar consumer.nextDelivery(1000)
que esperar para obtener el máximo de un segundo. Si se alcanza el tiempo de espera, el método devuelve 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. Espere un solo mensaje RabbitMQ con un tiempo de espera
- 2. ¿Cómo retractar un mensaje en RabbitMQ?
- 3. Akka Actor - espera algún tiempo para esperar un mensaje, de lo contrario envía un mensaje
- 4. ¿Cómo configurar la detección de tiempo de espera en un servidor RabbitMQ?
- 5. Ejecutar un programa desde PowerShell con tiempo de espera
- 6. Agregar un tiempo de espera para getchar()
- 7. Mensaje demorado en RabbitMQ
- 8. Sello de tiempo de llegada del mensaje Rabbitmq
- 9. GetMessage con un tiempo de espera
- 10. RabbitMQ y prioridad de mensaje
- 11. C# espere un tiempo sin bloquear
- 12. RabbitMQ consume un mensaje si existe y sale
- 13. feedparser con tiempo de espera
- 14. Función Inno Setup Exec() Espere por un tiempo limitado
- 15. Apio: ¿un mensaje en RabbitMQ puede ser consumido por dos o más trabajadores al mismo tiempo?
- 16. Espere a alcanzar un umbral de precisión con getCurrentPosition
- 17. Consulta de postgres de JDBC con un tiempo de espera
- 18. exec() con tiempo de espera
- 19. Excel VBA mensaje emergente "Espere por favor"
- 20. fcntl.flock - cómo implementar un tiempo de espera?
- 21. ¿Qué hace poll() con un tiempo de espera de 0?
- 22. detectando un tiempo de espera en ffmpeg
- 23. Tiempo de espera con jQuery.get()
- 24. Esperando la entrada del usuario con un tiempo de espera
- 25. Vuelva a intentar un comando Bash con tiempo de espera
- 26. Cómo configurar IHttpAsyncHandler un tiempo de espera?
- 27. PHP ssh2_connect() Implementar un tiempo de espera
- 28. Tiempo de espera esperando un MongoConnection
- 29. cómo configurar un tiempo de espera para un método
- 30. Tiempo de espera agotado - Tiempo de espera agotado