Лучший способ для класса обслуживания Grails для обнаружения выключения приложения? - PullRequest
6 голосов
/ 06 апреля 2011

У меня есть класс обслуживания Grails, который должен выполнить некоторую очистку, когда мой сервер приложений Tomcat выключен.

Я не вижу в документации Grails ничего о service.stop () или destroy () или способ реализации любого вида слушателя жизненного цикла приложения.

Какой лучший способ сделать это?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 06 апреля 2011

У вас есть несколько вариантов

Сделайте так, чтобы ваш сервис реализовал org.springframework.beans.factory.DisposableBean

class MyService implements org.springframework.beans.factory.DisposableBean {

    void destroy() throws Exception {

    }
}

Или используйте аннотацию

class MyService {

    @PreDestroy
    private void cleanUp() throws Exception {

    }
 }

IMO, опция аннотации предпочтительнее, потому что вы можете дать своему методу деструктора более значимое имя, чем destroy, и ваш открытый API классов не предоставляет зависимость Spring

5 голосов
/ 06 апреля 2011

grails-app/conf/BootStrap.groovy можно использовать при запуске и остановке приложения.

def init = {
  println 'Hello World!'
}

def destroy = {
  println 'Goodnight World!'
}

Примечание. При использовании режима разработки grails run-app в некоторых ОС CTL+C убивает JVM без возможности чистого отключения, и может не вызываться закрытие уничтожения. Кроме того, если ваша JVM получает kill -9, закрытие также не запустится.

1 голос
/ 06 апреля 2011

Я бы попробовал внедрить службу в Bootstrap и затем вызвать метод из блока уничтожения, поскольку блок уничтожения выполняется, когда приложение завершается, что-то вроде этого:

class BootStrap {

    def myService

    def init = {servletContext ->
    }

    def destroy = {
       myService.cleanUp()
    }
}
0 голосов
/ 06 апреля 2011

Это не совсем то же самое, что метод утилизации службы, но я закончил тем, что зарегистрировал Spring Bean с помощью метода завершения работы, который вызывается при остановке приложения.

Сначала создайте класс bean-компонента, например grails-app/utils/MyShutdownBean.groovy, который выглядит следующим образом (в имени класса или имени метода нет ничего священного, используйте все, что вы хотите):

class MyShutdownBean {
    public void cleanup() {
        // Do cleanup stuff
    }
}

Затем зарегистрируйте бин в grails-app/conf/spring/resources.groovy следующим образом:

beans = {
    myShutdownHook(MyShutdownBean) { bean ->
        bean.destroyMethod='cleanup'
    }
}

Если вы хотите выполнять очистку только на производстве, вы можете зарегистрировать ее следующим образом:

beans = {
    if (!grails.util.GrailsUtil.isDevelopmentEnv()) {
        myShutdownHook(MyShutdownBean) { bean ->
            bean.destroyMethod='cleanup'
        }
    }
}
...