Я бы хотел отправить сообщение на сервер RabbitMQ, а затем дождаться ответного сообщения (в очереди «ответ»). Конечно, я не хочу ждать вечно, если приложение, обрабатывающее эти сообщения, не работает - должен быть тайм-аут. Это звучит как очень простая задача, но я не могу найти способ сделать это. Я столкнулся с этой проблемой с Java API.RabbitMQ Ждать сообщения с таймаутом
ответ
Существует аналогичный вопрос. Хотя в ответах не используется java, возможно, вы можете получить некоторые подсказки.
com.rabbitmq.client.QueueingConsumer
имеет nextDelivery(long timeout)
метод, который будет делать то, что вы хотите. Однако это устарело. Написание собственного тайм-аута не так сложно, хотя может быть лучше иметь текущий поток и список идентификаторов времени, а не добавлять и удалять потребителей и связанные потоки времени.
Редактировать добавить: Заметили дату после ответа!
Я применил эту проблему с помощью C#, создав объект для отслеживания ответа на конкретное сообщение. Он устанавливает уникальную очередь сообщений для сообщения и подписывается на него. Если ответ не получен в указанный таймфрейм, таймер обратного отсчета отменяет подписку, которая удаляет очередь. Отдельно у меня есть методы, которые могут быть синхронны из моего основного потока (использует семафор) или асинхронного (использует обратный вызов) для использования этой функции.
В принципе, реализация выглядит следующим образом:
//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);
Клиентская библиотека RabbitMQ Java Теперь supports a timeout argument to its QueueConsumer.nextDelivery()
method.
Например, RPC учебник используется следующий код:
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;
}
}
Теперь вы можете использовать consumer.nextDelivery(1000)
ждать максимальной одной секунды. Если таймаут достигнут, метод возвращает 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. Bash: ждать с таймаутом
- 2. Запланированные сообщения с RabbitMQ
- 3. Надежные сообщения с RabbitMQ
- 4. отложенной петли сообщения с RabbitMQ
- 5. ZMQ ждать сообщения, ждать клиента для ответа
- 6. Как ждать выходных потоков, когда Process.WaitForExit используется с жестким таймаутом
- 7. Как читать непризнанные сообщения RabbitMQ/цикл RabbitMQ
- 8. Шифрование сообщения RabbitMQ
- 9. RabbitMQ получает неподтвержденные сообщения
- 10. RabbitMQ и приоритет сообщения
- 11. RabbitMQ DeDup как сообщения
- 12. RabbitMQ теряет сообщения
- 13. Redelivering неподтвержденные сообщения RabbitMQ
- 14. Как хранить сообщения rabbitMQ
- 15. RabbitMQ EventingBasicConsumer потеряет сообщения
- 16. RabbitMq: заменить дублированные сообщения
- 17. Сообщения очереди RabbitMQ
- 18. Почему rabbitmq потерял сообщения?
- 19. Получить тело сообщения rabbitmq
- 20. Облачные сообщения в RabbitMQ
- 21. RabbitMQ Обмен сообщения
- 22. java spring rabbitmq сделать очередь ждать другого
- 23. GetMessage с таймаутом
- 24. Буферные сообщения с очередью с диспетчером RabbitMQ
- 25. Потребители сообщения RabbitMQ перестают употреблять сообщения
- 26. Waitinga для сообщения в Play with rabbitMQ
- 27. RabbitMQ отбрасывает сообщения после первого
- 28. Возможно ли потерять сообщения с помощью MSMQ MessageQueue.Peek с таймаутом?
- 29. RabbitMQ сохранить сообщения в очереди
- 30. Каков максимальный размер сообщения RabbitMQ?