Завершение работы для Java-приложения - PullRequest
38 голосов
/ 11 октября 2009

Мне нужно сохранить некоторые данные предпочтительно, когда Java-приложение остановлено или когда Tomcat остановлен. Как это может быть сделано? Редактировать: любой недостаток, если я использую крюк выключения jvm?

Ответы [ 4 ]

52 голосов
/ 11 октября 2009

Используйте класс, который реализует ServletContextListener в вашем web.xml:

<web-app>
    <!-- Usual stuff here -->
    <listener>
        <listener-class>com.mycompany.MyClass</listener-class>
    </listener>
</web-app>
15 голосов
/ 11 октября 2009

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

Различие важно - независимо от того, какой метод вы используете (сервлет / контекстный прослушиватель, как подсказывают другие ответы, или JVM shutdown hook ), нет никаких гарантий , что он действительно будет прибег.

События уничтожения сервлетного / контекстного прослушивателя будут запускаться только при нормальном (изящном) завершении работы контейнера ИЛИ при перезагрузке приложения. Отключение JVM также будет срабатывать при прерывании процесса; однако, уничтожение процесса (или отключение питания), очевидно, не вызовет ни того, ни другого.

11 голосов
/ 24 августа 2011

Как дополнение к ответу Леонма:

Если вы используете Spring, вы можете использовать Spring Lifecycle Management для достижения аналогичного эффекта. Например, вы можете аннотировать метод в компоненте с помощью @PreDestroy, чтобы он автоматически вызывался при завершении работы контейнера. Таким образом, вам не нужно ничего помещать в web.xml.

См. Жизненный цикл фабрики весенних бобов .

3 голосов
/ 11 октября 2009

Я предлагаю использовать ehcache для кеширования этой информации. Если вы используете постоянное хранилище ehcache, то при повторном запуске Tomcat кэшированные данные будут по-прежнему доступны.

По сути, это делегирует проблему в ehcache, который оптимизирован для подобных проблем.

...