Перезапускаемая служба с использованием Guava

В настоящее время я разрабатываю приложение, в котором мне нужно управлять состоянием нескольких служб и останавливать / запускать их на основе некоторых событий. Проблема в том, что, как указано в документации, служба Guava является однонаправленной, что означает, что после остановки ее нельзя запустить снова.

Поскольку мне нужно как-то обойти эту проблему, я столкнулся с парой альтернатив, которые я хотел бы вынести на рассмотрение (тем более, что у каждой из них могут быть недостатки, о которых я сейчас не знаю. ).

Первое очевидное решение этой проблемы - создать экземпляр новой службы, когда мне нужно ее «перезапустить». Это работает, но в моей текущей архитектуре это немного усложнит: в настоящее время я инсталлирую все службы и на основе событий из EventBus запускаю или останавливаю их, если это необходимо. Класс, вызывающий методы start и stop, сохраняет только ссылку на карту служб и вызывает правильный метод для этих экземпляров на основе полученного события. Если мне нужно создать экземпляр нового объекта в ответ на Событие, мне придется отказаться от некоторых имеющихся у меня разъединений (возможно, сохраняя класс каждого типа Сервиса и вызывая конструктор с помощью отражения).

Другая возможность - реализовать интерфейс службы как RestartableThreadedService (или что-то в этом роде).Если бы я выбрал этот маршрут, мой метод start () мог бы создать еще один поток, как если бы это был первый раз, и сбросить состояния.

Есть ли явный недостаток у второго подхода? Боюсь, что здесь может отсутствовать какой-то очевидный недостаток (помимо необходимости кодировать что-то более сложное), особенно в отношении управления потоками.

18
задан cdeszaq 23 January 2012 в 18:07
поделиться