J'ai ouvert ce bogue dans le système de suivi des bogues de Spring. Ce serait cool si des personnes intelligentes pouvaient déjà m'aider.
Réponses
Trop de publicités?Mettre "true" sur la propriété du démon pour le planificateur - eg
<!-- task scheduling for @Scheduled annotation -->
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="1" />
<bean id="myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="2" />
<property name="threadNamePrefix" value="myScheduler-"/>
<property name="waitForTasksToCompleteOnShutdown" value="false" />
<property name="daemon" value="true" />
</bean>
Avez-vous essayé d'avoir votre @Scheduled
implémentation d'un haricot DisposableBean
(afin qu'il puisse être informé de la fermeture du contexte Spring) et de la fermeture explicite du contexte dans votre fichier main()
méthode ?
Conceptuellement, je ne vois pas comment le code affiché peut fonctionner comme vous l'attendez. Spring a besoin de lancer de nouveaux threads pour exécuter votre @Scheduled
au moment et au rythme que vous avez configurés, ce qui signifie que lorsque le code dans votre main()
se termine, il reste des threads non-démons dans la JVM. Si vous ne dites pas à Spring d'arrêter ces threads, comment seront-ils terminés ?
edit : pour être clair, je pense que la solution est d'appeler explicitement close()
sur votre ApplicationContext
. Sinon, Spring n'a aucun moyen d'indiquer au service d'exécution de vos tâches planifiées de s'arrêter. Un hook d'arrêt de la JVM ne sera pas invoqué lorsque main()
se termine puisque les threads non-démons sont toujours en cours d'exécution.
Voici la solution en utilisant la configuration Java
@Bean
public TaskScheduler daemonTaskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setDaemon(false);
taskScheduler.setThreadNamePrefix("daemon");
taskScheduler.setPoolSize(5);
return taskScheduler;
}
ou si vous voulez vraiment entrer dans les détails, la classe de configuration peut être comme ceci
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Une chose n'est pas prise en charge cependant, c'est la possibilité d'utiliser plusieurs TaskSchedulers dans une seule application. J'ai ouvert une JIRA pour cela