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 <<<");
}
}
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="..." />
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 ... **/
}
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
.
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
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.
Pour moi, la solution qui fonctionnait au printemps 5 était que je devais ajouter @Component
à la classe ayant @Scheduled
méthodes annotées.
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.
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
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!
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>
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.