web-dev-qa-db-fra.com

Spring Scheduler ne fonctionne pas

J'ai un problème avec le planificateur de tâches basé sur les annotations de Spring - je ne peux pas le faire fonctionner, je ne vois aucun problème ici ...

application-context.xml

<task:scheduler id="taskScheduler" />
<task:executor id="taskExecutor" pool-size="1" />
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" />

haricot

@Service
public final class SchedulingTest {

    private static final Logger logger = Logger.getLogger(SchedulingTest.class);

    @Scheduled(fixedRate = 1000)
    public void test() {
        logger.debug(">>> Scheduled test service <<<");
    }

}
22
user219882

Si vous souhaitez utiliser task:annotation-driven et votre annotation @Scheduled ne fonctionne pas, alors vous avez probablement manqué context:component-scan dans votre contexte xml. Sans cette ligne, Spring ne peut pas deviner où chercher vos annotations.

<context:component-scan base-package="..." />
24
Serkan Arıkuşu

Spring @Configuration (configuration non-xml) pour les tâches basées sur les annotations

Ajoutez simplement @EnableScheduling sur votre classe WebMvcConfig


    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    @Configuration
    @EnableWebMvc
    @EnableAsync
    @EnableScheduling
    public class WebMvcConfig implements WebMvcConfigurer {
       /** Annotations config Stuff ... **/
    }

47
ahll

Cela se produit parce que, par défaut, Spring lazy initialise les beans.

Désactivez l'initialisation différée pour le bean en plaçant cette annotation

@Lazy(false)

en plus de votre @Component.

4

si vous avez dispatcher-servlet.xml, déplacez-y votre configuration. cela a fonctionné pour moi et j'ai laissé un commentaire dans cet article: https://stackoverflow.com/a/11632536/5461

3
Hazhir

J'ai finalement trouvé une solution.

application-context.xml

<bean id="schedulingTest" class="...SchedulingTest" />

<task:scheduled-tasks>
    <task:scheduled ref="schedulingTest" method="test" cron="* * * * * ?"/>
</task:scheduled-tasks>

et la méthode test() sans l'annotation. Cela exécute la méthode toutes les secondes et fonctionne parfaitement.

3
user219882

Pour moi, la solution qui fonctionnait au printemps 5 était que je devais ajouter @Component à la classe ayant @Scheduled méthodes annotées.

2
nabeel

Vous devriez également vérifier que lazy-init est faux pour ce bean ou utiliser default-lazy-init="false" dans les haricots.

Cela a résolu mon problème.

1
Amir M

La solution pour moi était d'ajouter dans l'applicationContext.xml:

<task:annotation-driven/>

avec le schemaLocation suivant:

http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
1
Joao Gavazzi

Après avoir configuré les planificateurs, ajoutez @ EnableScheduling dans votre classe principale. **enter image description here**

0
pasindupa

Nous avions la raison suivante: le service avait besoin d'une interface (en raison de l'annotation de transaction) - IDE a également ajouté cette annotation tx à l'interface. Mais @Scheduled était dans l'implémentation de la classe de service - et Spring l'a ignoré car il pensait que seules les annotations existaient sur l'interface. Veillez donc à n'avoir que des annotations sur l'implémentation des classes!

0
Strinder

J'ai dû mettre à jour mon dispatcher-servlet.xml avec

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task
            http://www.springframework.org/schema/task/spring-task-4.3.xsd"></beans>

Définition du haricot ci-dessous:

<bean id="scheduledTasks" class="com.vish.services.scheduler.ScheduledTasks"></bean>
0
vishsodhani

Ajoutez simplement @EnableScheduling à n'importe quelle classe de configuration Spring Boot annotée avec @Configuration et pour la méthode qui exécute le travail de planification, ajoutez l'annotation @Scheduled.

0
Hany Sakr