Можно ли в компоненте Spring использовать метод выключения, который может использовать транзакции?

В методе destroy компонента Spring я хочу выполнить несколько запросов, чтобы очистить некоторые данные в базе данных. Spring, похоже, не допускает этого никакими средствами, которые я могу найти.

Ошибка всегда выглядит примерно так:

Вызов метода уничтожения завершился неудачно. bean с именем someBean: org.springframework.beans.factory.BeanCreationNotAllowedException: Ошибка при создании bean-компонента с именем 'transactionManager': компонент-одиночка создание запрещено, пока синглтоны этой фабрики находятся в разрушение (Не запрашивайте фасоль из BeanFactory в методе уничтожения реализация!)

Далее Spring будет указывать на необходимость вызова shutdownDestroy после того, как компонент больше не нужен. Но я получаю указанную выше ошибку при попытке использовать транзакции.

<bean id="someId" name="someName" class="someClass"
 destroy-method="shutdownDestroy"/>

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

<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>

, а затем помечаю метод @PreDestroy . Этот метод также не может использовать транзакции.

Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: Спасибо! У меня был компонент, реализующий SmartLifecycle, и я добавил следующее, и он работает очень хорошо.

private boolean isRunning = false;

@Override
public boolean isAutoStartup() {return true;}

@Override
public boolean isRunning() {return isRunning;}

/** Run as early as possible so the shutdown method can still use transactions. */
@Override
public int getPhase() {return Integer.MIN_VALUE;}

@Override
public void start() {isRunning = true;}

@Override
public void stop(Runnable callback) {
    shutdownDestroy();
    isRunning = false;
    callback.run();
}

@Override
public void stop() {
    shutdownDestroy();
    isRunning = false;
}
13
задан HappyEngineer 5 May 2011 в 20:57
поделиться