У меня есть проект, в котором я установил таймаут 5 секунд (getRabbitTemplate (). SetReplyTimeout (5000))
и использую метод sendAndReceive для отправки сообщений:getXbidRabbitTemplate ()
SendAndReceive (exchange, routingkey, msg)
.
Сегодня произошла ошибка в соединении
(ShutdownSignalException)
но в двух партиях тайм-аута не было. Первая отгрузка произошла 09-04-2019 07:25:33.980; и второй 04.09.2019 07:25:36.902;
Я не получил ответа (или какой-либо ошибки) и вскоре после этого выскочила ошибка подключения (09-04-2019 07:25:52.939)
В других случаях мы обнаруживали ошибку TimeOut, и единственное изменение конфигурации заключалось в том, что мы удалили retryTemplate из конфигурации RabbitTemplate.
Вот как мы обнаруживаем TimeOut:
getRabbitTemplate().setReplyTimeout(5000);
mResponse = getRabbitTemplate().sendAndReceive(exchange, routingkey, msg);
if (mResponse == null)
{
// TIMEOUT
}
Я ожидал, что если в течение этих 5 секунд не будет получено ответа, я введу часть TIMEOUT. Возможно ли, что если соединение будет разорвано и сообщение не дойдет до сервера, то TIMEOUT не произойдет?
Тайм-аут не имеет ничего общего с общением с кроликом, вызывающий поток просто вызывает get(timeout, TimeUnitMilliseconds)
будущее. Когда ответ получен (в другом потоке), он завершает будущее, и get()
возвращает этот результат. Если ответ не получен, время ожидания get()
истекает.
Я не вижу никакого способа, которым поток никогда не может истечь по времени.
Спасибо Гэри. Я создал небольшой проект, чтобы попытаться воспроизвести ошибку, но я ее не понимаю, тайм-аут прыгает, когда это необходимо. Тем не менее, это уже произошло дважды в производстве, и я не уверен, на что еще обратить внимание.