2015-12-27 4 views
3

Я выполняю сервлет CXF, который предоставляет несколько методов обслуживания.Завершение работы Apache CXFServlet

web.xml:

... 
<servlet> 
    <description>Apache CXF Endpoint</description> 
    <display-name>cxf</display-name> 
    <servlet-name>CXFServlet</servlet-name> 
    <servlet-class> 
     org.apache.cxf.transport.servlet.CXFServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
... 

Как я могу программно shuting вниз такой экземпляр сервера запущенную, правильно?

public class ServiceImpl { 
... 
    @GET 
    @Path("/shutdown/") 
    void shutdown() { 
     // ...releasing any resources... 
     // ...terminating any threads... 
     // TODO terminating running server 
     ... 
    } 
... 

ответ

1

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

Вам необходимо индивидуальное решение. Я вижу два варианта:

  • расширяющие CXFServlet и переопределить его service метод
  • запись (сервлет) фильтр

Оба могли бы проверить некоторые глобальные переменные (в простейшем случае) и сразу же возвращают ошибку HTTP, если услуги были закрыты. Переменная должна быть установлена ​​на ServiceImpl#shutdown.


EDIT:

На Tomcat можно также использовать Manager App to stop existing application. Вы можете ссылаться на службы из своего сервиса или напрямую.

Это, очевидно, останавливает все приложение и все его сервлеты. Я не тестировал это, но я уверен, что текущие запросы не будут завершены, но закончатся изящно, прежде чем приложение будет остановлено (по крайней мере, так оно работает на некоторых серверах приложений, таких как WebSphere Application Server).

Если вам требуется более мелкомасштабный подход к остановке и обновлению частей приложения, вы можете использовать OSGi. Но это тема для другого вопроса.

+0

Честно говоря, я не забочусь о нарушении HTTP-запроса, когда сервлет в настоящее время отключается. Но я заинтересован в отправке веб-контейнера сигнала выключения. Нет ли удобного API? В разделе [Tomcat отключается закрывающая банка] (http://stackoverflow.com/a/25992568/2138953) Я читал, что вызов '' System.exit (0) '' не был бы подходящим подходом. – PAX

+0

@PAX вам нужно быть более конкретным. Что вы хотите закрыть? Один сервлет (который я предположил) или весь сервер/jvm? Какой сервер вы используете? Кот? –

+0

Я использую Tomcat в качестве веб-контейнера. Моя цель - изящно закрыть весь сервлет CXF. Конечно, перед закрытием все ресурсы должны быть освобождены, а сначала запущены задачи пула потоков, прежде всего. Выключение должно усиливать две вещи: 1. Прекратить подавать дополнительные запросы, 2. Разрешить замену базовой реализации сервлета, которая обслуживает запросы. Наконец, сервлет снова можно перезапустить. – PAX

1

В зависимости от вашей спецификации сервлета. у вас есть выбор класса декларации ...

  1. Создайте свой собственный класс, реализующий интерфейс http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html и объявить его с @WebListener -> Затем реализовать 2 метода: contextDestroyed() и contextInitialized() ...

  2. Сделайте то же самое без объявления аннотации @WebListener и вместо этого объявите ранее созданный класс в ваш файл web.xml (с полным именем класса).

+0

Я точно знаю, что этот код позволит вам правильно инициализировать и выключить «вручную» – Jdaydai

+0

Я думаю, что если нет метода API для запуска выключения веб-контейнера, программным путем, то мне нужно освободить мои ресурсы и завершите определенные процессы в этом крюке остановки. – PAX

Смежные вопросы