Dans un haricot de printemps, est-il possible d'avoir une méthode d'arrêt qui peut utiliser des transactions?
Dans la méthode destroy d'un ressort de haricots je veux exécuter des requêtes pour nettoyer certaines choses dans la base de données. Le printemps ne semble pas permettre par tous les moyens que je peux trouver.
L'erreur est toujours quelque chose comme:
Invocation de la méthode destroy échoué sur
bean avec le nom "someBean':
org.springframework.les haricots.usine.BeanCreationNotAllowedException:
Erreur lors de la création de haricots avec le nom
la "transactionManager": le Singleton bean
création qui n'est pas permis à tout le
les singletons de cette usine sont en
destruction (Ne demande pas un haricot
à partir d'un BeanFactory dans une méthode destroy
la mise en œuvre!)
La suite dira printemps à l'appel shutdownDestroy après le haricot n'est plus nécessaire. Mais, j'obtiens l'erreur ci-dessus lorsque vous essayez d'utiliser les transactions.
<bean id="someId" name="someName" class="someClass"
destroy-method="shutdownDestroy"/>
La même chose est vraie quand j'active courantes du cycle de vie des annotations à l'aide de:
<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/>
puis marquez la méthode avec @PreDestroy
. Cette méthode ne peut pas utiliser les transactions.
Est-il possible de faire cela?
EDIT:
Merci! J'ai eu la fève de mettre en œuvre SmartLifecycle et par adjonction, et il fonctionne très bien.
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;
}
source d'informationauteur HappyEngineer
Vous devez vous connecter pour publier un commentaire.
Question Intéressante. Je dirais que vous devriez être en mesure de le faire par laisser votre bean mettre en œuvre des
SmartLifeCycle
.De cette façon, si votre
int getPhase();
méthode renvoieInteger.MAX_VALUE
il sera parmi les premiers à être appelés lorsque leApplicationContext
enfin s'arrête.Référence:
rappels
SmartLifeCycle
javadocJ'ai rencontré ce même problème. Après le départ de printemps du code source, U pouvez essayer de implémente
onApplicationEvent sera appeler avant de haricot destory, vous pouvez le vérifier sur printemps org.springframework.contexte.de soutien.AbstractApplicationContext#doClose méthode. Je colle ci-dessous, de sorte ContextEvent -> Cycle de vie -> Bean destory.