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.


Sommaire Intégration d'API (3)
précédent sommaire suivant
 

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"); 
    } 
}
Ce bean doit bien évidemment être défini dans le contexte Spring :

Code xml : Sélectionner tout
1
2
<bean id="tachePlannifie" class="com.developpez.spring.Tache"> 
   </bean>
Ce Bean peut être configuré via Spring comme n'importe quel Bean afin d'avoir accès par exemple à une base de données, ou autre. Notons par la même occasion que cet objet est un simple POJO et n'est aucunement lié à un framework spécifique. Ce Bean n'hérite d'aucune classe, n'implémente aucune interface et il n'y a pas de standard défini en ce qui concerne le nom de la méthode qui représente la tâche.

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>
Maintenant qu'on a défini « Quoi faire », il est nécessaire de spécifier « Quand le faire ». Pour cela, il faut utiliser une classe ScheduledTimerTask : 

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>
Ici, une minute d'attente (60 000 millisecondes ) avant le premier lancement sera réalisée, et ensuite la tâche sera relancée toutes les 10 minutes ( 600 000 millisecondes).

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>
Cette fabrique possède une propriété scheduledTimerTasks de type liste de ScheduledTimerTask. Elle permet donc de gérer plusieurs tâches planifiées.

Mis à jour le 22 septembre 2007 Hikage

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>
On place la valeur de la propriété cacheName sur le nom d'une des définitions de cache spécifiées dans le fichier ehcache.xml.

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>

Mis à jour le 24 avril 2008 Righetto Dominique

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"/>
La tâche est donc bien un POJO et le nom de la méthode du job est au choix du développeur.

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>
Il suffit donc de définir la propriété targetObject avec une référence vers le bean défini juste avant, et la propriété targetMethod avec le nom de la méthode à utiliser.

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 premier trigger est simple, il suffit de définir le moment de la première exécution et ensuite la période d'exécution.
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>

Mis à jour le 24 avril 2008 Hikage

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2017 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.

 
Responsables bénévoles de la rubrique Spring : Mickael Baron - Robin56 -