Em um bean de primavera, é possível ter um método de desligamento que possa usar transaçõe
No método destroy de um spring bean, quero executar algumas consultas para limpar algumas coisas no banco de dados. A primavera parece não permitir isso de forma alguma que eu possa encontra
O erro é sempre algo como:
alha no método Invocation of destroy no bean com o nome 'someBean': org.springframework.beans.factory.BeanCreationNotAllowedException: Erro ao criar o bean com o nome 'transactionManager': a criação do bean Singleton não é permitida enquanto os singletons desta fábrica estão em destruição (Não solicitar um bean de um BeanFactory em uma implementação de método de destruição!)
O seguinte diz à primavera para chamar shutdownDestroy depois que o bean não é mais necessário. Mas, recebo o erro acima ao tentar usar transações.
<bean id="someId" name="someName" class="someClass"
destroy-method="shutdownDestroy"/>
O mesmo ocorre quando eu ativo anotações comuns do ciclo de vida usando:
<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>
e marque o método com@PreDestroy
. Esse método também não pode usar transações.
Há alguma maneira de fazer isso
EDIT: Obrigado! Eu fiz o bean implementar o SmartLifecycle e adicionar o seguinte e funciona muito be
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;
}