FAQ SpringConsultez toutes les FAQ
Nombre d'auteurs : 5, nombre de questions : 41, dernière mise à jour : 24 avril 2008 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
Il est tout à fait possible d'utiliser l'API Timer de Java afin de gérer une planification de tâches avec Spring.
Pour cela, la première étape est de créer un Bean qui possédera une méthode qui représentera la tâche en question :
Code java : | Sélectionner tout |
1 2 3 4 5 6 | public class JobTest { public void lancementProgramme(){ System.out.println("Lancement"); } } |
Code xml : | Sélectionner tout |
1 2 | <bean id="tachePlannifie" class="com.developpez.spring.Tache"> </bean> |
L'étape suivante est de définir un Bean qui va justement faire la liaison entre un gestionnaire de tâches et notre précédent Bean afin de spécifier quelle méthode doit justement être utilisée :
Code xml : | Sélectionner tout |
1 2 3 4 | <bean id="tachePlannifieTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean"> <property name="targetObject"><ref bean="tachePlannifie"/> </property> <property name="targetMethod"><value>lancementProgramme</value></property> </bean> |
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | <bean id="tachePlannifieScheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <!-- Attendre une minute avant le premier lancement --> <property name="delay" value="60000"/> <!-- Et relancer ensuite toutes les 10 minutes --> <property name="period" value="600000"/> <property name="timerTask"> <ref bean="tachePlannifieTask"/> </property> </bean> |
Une fois que le quand et le quoi sont définis, il est nécessaire de provoquer le lancement de cette tâche, et cela est géré par le TimerFactoryBean :
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 | <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="tachePlannifieScheduledTask"/> </list> </property> </bean> |
Pour intégrer EhCache et Spring afin de pouvoir injecter directement un bean Cache, on définit le bean ci-dessous dans un des fichiers de définition du contexte Spring :
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | <bean id="customCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager"> <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml" /> <property name="shared" value="false" /> </bean> </property> <property name="cacheName" value="SampleConfigOne" /> </bean> |
Dans cette déclaration, on précise que le fichier de définition des caches se trouve dans le classpath au niveau de la racine (on pourrait également utiliser classpath*:ehcache.xml pour lui indiquer de chercher ce fichier dans tous les classpath). On précise également que le CacheManager n'est pas partagé via la propriété shared.
Ensuite on peut injecter ce bean normalement dans tout bean qui en aurait besoin via :
Code xml : | Sélectionner tout |
1 2 3 | <bean > <property name="cache" value="customCache" /> </bean> |
Quartz est une API destinée à la création de tâches planifiées. Elle possède certains avantages par rapport à la méthode basée sur le Timer :
- planification plus fine, avec une syntaxe basée sur le Crontab Linux ;
- possibilité de rendre les tâches persistantes, afin d'avoir un historique des exécutions entre les différents lancements d'une application ;
- possibilité d'intégration avec JTA pour la gestion des transactions.
Spring possède une intégration avec celle-ci, et permet l'exécution de tâches basées sur des POJO.
La première étape est donc de créer une tâche, par la définition d'un bean :
Code java : | Sélectionner tout |
1 2 3 4 5 6 | ublic class MonJob { public void jobMethod(){ // Code de la méthode } } |
Code xml : | Sélectionner tout |
<bean id="MonJob" class="com.developpez.spring.quartz.MonJob"/>
L'étape suivante est d'utiliser une classe fournie par Spring, qui va créer le JobDetail (la tâche qui sera compréhensible par Quartz) :
Code xml : | Sélectionner tout |
1 2 3 4 | <bean name="tache" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="MonJob"/> <property name="targetMethod" value="jobMethod"/> </bean> |
Une fois la tâche définie, il est nécessaire de définir le moment où elle doit être exécutée. Pour cela, deux classes existent : une pour une planification simple, une autre pour une planification plus complexe :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!-- Méthode simple --> <bean id="triggerTache" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="tache"/> <!-- Démarre la première fois après 10 secondes --> <property name="startDelay" value="10000"/> <!-- Ensuite toutes les 50 secondes --> <property name="repeatInterval" value="50000"/> </bean> <!-- Méthode complexe --> <bean id="triggerTache2" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="tache"/> <!-- Exécution toutes les 5 secondes --> <property name="cronExpression" value="0/5 * * * * ?"/> </bean> |
Le deuxième est un peu plus complexe et se base sur une syntaxe Crontab : seconde minute heure jour-dans-le-mois mois jour-dans-la-semaine année
La dernière étape est de définir un gestionnaire de planification :
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 | <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="triggerTache2"/> </list> </property> </bean> |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.