2 votes

Les tâches programmées maintiennent la JVM suspendue lorsque le programme autonome veut se terminer, la JVM doit être tuée.

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.

https://jira.springsource.org/browse/SPR-9341

4voto

user2830001 Points 56

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>

0voto

matt b Points 73770

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.

0voto

Peter Szanto Points 2425

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X