В настоящее время я разрабатываю приложение, в котором мне нужно управлять состоянием нескольких служб и останавливать/запускать их на основе некоторых событий. Проблема заключается в том, что, как указано в документах, служба Guava является однонаправленной, то есть после ее остановки ее нельзя запустить снова.
Так как мне нужно как-то обойти эту проблему, я столкнулся с несколькими альтернативами, которые я бы хотел вынести на рассмотрение (тем более, что могут быть недостатки для каждого из них, о которых я не знаю сейчас).
Первым очевидным решением этой проблемы является создание новой службы, когда мне нужно "перезапустить" ее. Это работает, но в моей нынешней архитектуре это немного усложнит ситуацию: в настоящее время я устанавливаю все службы и основываюсь на событиях из EventBus, запуская или останавливая их, если это необходимо. Класс, который вызывает методы start и stop, сохраняет только ссылку на карту сервисов и вызывает правильный метод в этих экземплярах на основании полученного события. Если мне нужно создать экземпляр нового объекта в ответ на Событие, мне придется отказаться от некоторой де-связи, которая у меня есть (возможно, сохраняя класс каждого типа Сервиса и вызывая конструктор с использованием отражения).
Другая возможность - реализовать интерфейс службы как RestartableThreadedService (или что-то в этом роде). Если бы я взял этот маршрут, мой метод start() мог бы создать другой поток, как если бы это был первый раз, и reset состояния.
Есть ли какой-либо явный недостаток для второго подхода? Я боюсь, что у меня может возникнуть некоторый очевидный недостаток (помимо того, что нужно что-то немного усложнять), особенно в отношении управления потоками.