Мое приложение подключается к rabbitMQ. Иногда это бросает AMQPTimeoutException. КонкретнееОшибка при отправке данных. Время соединения сокета истекло.«
Мое решение:
Я ловлю AMQPTimeoutException и вызывая мой метод переподключения. После чего программа продолжает нормальное выполнение. Также я установил флаг, чтобы исключение обрабатывалось не более 3 раз.
try
{
sendMethod($message);
} catch (AMQPTimeoutException $e) {
echo "caught socket connection exception". "\n";
$this->reconnect($message, $exchangeName, $queue);
}
//reconnect internally checks the flag
Мой вопрос: это лучшая практика? Если нет, какие другие решения возможны?
Заметка : Приложение написано на PHP.
Да.
Исключения всегда должны быть пойманы и обработаны. Это, безусловно, лучшая практика. Исключением являются структуры потока управления в языке, который позволяет программистам иметь дело с вещами, которые они не ожидали или очень редко ожидают.
В вашем сценарии вполне разумно ловить исключения, когда речь идет о сокетах. Связь по протоколу TCP / IP не идеальна, и в зависимости от широкого диапазона условий сбой сокета в определенный момент времени гарантирован на 100%.
Я бы порекомендовал вам начать регистрировать, ПОЧЕМУ происходят эти тайм-ауты. Обычно они вызваны истощением ресурсов, но где это? Сервер A или Сервер B … или этот клиент …
Тайм-ауты являются признаком проблемы, которую необходимо исследовать. Хотя вы обрабатываете их правильно, я настоятельно рекомендую добавить некоторые записи, чтобы выяснить, почему они происходят.
Других решений пока нет …