Как вы корректно завершаете работу Java-сервиса из сценария оболочки Bash?

3

Я конвертирую службу REST Java из "традиционного" способа - как сервлет-совместимый .war, который развертывается на сервере приложений с несколькими арендаторами (Tomcat) - в гораздо более простой встроенной системе, где есть простой Основной класс Java, который запускает встроенный HTTP-сервер (Grizzly + Jersey). Единственным недостающим элементом является обертка сервиса. Я могу вручную запустить службу, выполнив "java -jar myservice.jar", но я хотел бы реализовать ее как базовую службу Linux.

Обычно это выполняется с помощью простой оболочки Bash script, которую вы вставляете в /etc/init.d. Я видел несколько простых примеров, но они выполняют остановку с процессом, а не грациозным отключением. Я также видел некоторые коммерческие инструменты для этого, но эта задача кажется слишком простой, чтобы задействовать коммерческий инструмент.

Мое первое предположение заключалось бы в том, чтобы добавить отдельную суперпростую службу REST на втором порту, который прослушивает запросы на завершение работы, и таким образом отправляет запросы на завершение работы /etc/init.d Bash shell script.

Есть ли лучшие или более стандартные решения этой проблемы?

Теги:
web-services
daemon

3 ответа

2
Лучший ответ

kill в порядке (если он не убивает -9), вы должны только реализовать выключение крюка, чтобы изящно остановить бесконечный

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

        @Override
        public void run() {
            //TODO stop web server and close db connection if needed

        }
    }));
1

Использование управляющего сокета является стандартным способом обработки грациозного отключения для служб Unix, которым требуется нечто большее, чем сигнал (например, базы данных). Многие из них используют сокет домена Unix, но становится привычным использовать HTTP для такого рода вещей. Вы можете рассмотреть любой другой URL-адрес HTTP с контролируемым доступом (либо путем привязки к другому сокету, либо путем написания логики для управления, кто может его назвать), либо Java RMI. Ни одно из них не имеет превосходного преимущества над другим.

Обратите внимание, что все, что вы делаете, вероятно, не будет "REST" и на самом деле не должно быть; вы будете запускать удаленный вызов процедуры.

0

Есть ли лучшие или более стандартные решения этой проблемы?

Если вы не хотите слушать HTTP-вызов или писать свой собственный код, который использует сокеты, вы можете использовать демонов Apache. См. Ответ здесь: Как преобразовать java-программу в daemon с помощью jsvc?

Там также JSW и YAJSW которые похожи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню