Нет необходимости добавлять слушателя к подписчику, если вы просто хотите воссоздать подписчика в случае сбоя.Вместо этого вы можете перехватить исключение на awaitTerminated
:
try {
boolean initializeSubscriber = true;
while (initializeSubscriber) {
try {
createSingleThreadedSubscriber();
subscriber.startAsync().awaitRunning();
initializeSubscriber = false;
subscriber.awaitTerminated();
} catch (Exception ex) {
LOGGER.error("Error in the Subscriber service", ex);
cleanupSubscriber();
initializeSubscriber = true;
}
}
} catch (RuntimeException e) {
} finally {
shutdown();
}
Если абонент успешно завершит работу из-за вызова stopAsync
, awaitTerminated
не сгенерирует исключение.Если было какое-то исключение, то awaitTerminated
выдаст IllegalStateException
, потому что состояние будет FAILED
вместо TERMINATED
.
Обратите внимание, что временные ошибки обрабатываются самой библиотекой.Например, если сервер на короткое время становится недоступным из-за перебоев в работе сети, библиотека без проблем пересоединится и продолжит доставлять сообщения.Сбои, которые приводят к изменению состояния подписчика, - это, вероятно, постоянные сбои, такие как проблемы с разрешениями (когда у учетной записи, на которой работает подписчик, нет разрешения на подписку), или проблемы с ресурсами (например, после удаления подписки).В этих случаях постоянных сбоев воссоздание подписчика, скорее всего, приведет к той же самой ошибке, если не предпринять ручные шаги для вмешательства и устранения проблемы.