Question

Nous utilisons ScheduledTimerTask pour gérer les emplois (automatique) dans notre application.We utilisent le code suivant:

<bean id="SampleTask" 
  class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
    <property name="targetObject" ref="sampleScheduler" />
    <property name="targetMethod" value="runMethod" />
</bean>

<bean id="sampleScheduler" class="com.sample.SampleScheduler" />

<bean id="timerTask"
    class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <property name="timerTask" ref="schedulerTask" />
    <property name="delay" value="1000" />
    <property name="period" value="60000" />
</bean>

<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
    <property name="scheduledTimerTasks">
        <list>
            <ref local="timerTask" />
        </list>
    </property>
</bean>

En utilisant le code ci-dessus runMethod de fonctionne bien pour tout le monde minute.But nous voudrions changer l'exécution en fonction par exemple de serveur time.For, si le temps dans le serveur est 18 heures alors nous devons invoquer la function.How à y parvenir?

L'aide serait appréciée.

Était-ce utile?

La solution

Vous pouvez utiliser la tâche déclencheur du printemps pour appeler à une période de temps certian, vous pouvez utiliser CronTrigger.

Une documentation détaillée est ici

Autres conseils

Si vous devez utiliser uniquement ScheduledTimerTask, puis appeler la tâche de minuterie une fois par minute. Maintenant, à partir de la tâche de minuterie, vérifiez si le temps est six heures et exécuter les fonctionnalités nécessaires. retour d'autre.

Con: Cette tâche est NO-OP sont exécutées pour chaque minute (sauf pour une fois qu'il doit faire un peu de traitement.

ou

Invoke la TimeTask une seule fois du printemps. Lorsque la tâche est exécutée, vous pouvez obtenir l'heure actuelle et peut calculer la différence entre le temps actuel et le temps d'exécuter la tâche. (Laissez cette différence appelée DELAY).

avec de cette tâche de minuterie, démarrer une nouvelle Exécuteur Executors.newScheduledThreadPool (1) et scheduleAtFixedRate avec retard intial = RETARD et régler la période 1 jour

Spring Quartz SchedulerFactoryBean

applicationContext.xml

<!-- quartz -->

<bean id="emial" class="quartzcore.QuartzEmail"/>

    <bean id="myTask" class="quartzcore.MyTask" >
        <property name="edao" ref="empdao"/>
        <property name="email" ref="emial"/>        
    </bean>
<!--
    <bean id="schedulerTask" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
        <property name="targetObject" ref="myTask" />
        <property name="targetMethod" value="sayHello" />
    </bean>

<bean id="timerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
    <property name="timerTask" ref="schedulerTask" />
    <property name="delay" value="5000" />
    <property name="period" value="5000" />
</bean>

<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
    <property name="scheduledTimerTasks">
        <list>
            <ref local="timerTask" />
        </list>
    </property>
</bean>
 -->

    <bean name="quartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="myTask" />
        <property name="targetMethod" value="sayHello" />
    </bean>

    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> 
        <property name="jobDetail" ref="quartzJob" />
        <property name="repeatInterval" value="1000" />
        <property name="startDelay" value="1000" />
    </bean>

    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="quartzJob" />
        <property name="cronExpression" value="0/15 * * * * ?" /> 
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="quartzJob" />
            </list>
        </property> 
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
            </list>
        </property>
    </bean>

    </beans>

Procédé de classe perticular à exécuter selon la configuration en XML.

public class MyTask {

    private EmpDao edao;        
    private QuartzEmail email;    
    public static int size = 10;

    public void sayHello() {
        System.out.println("Hello !!! ");

        int currSize = 0;
        if ((currSize = edao.emp_count()) != size) {
            size = currSize;
            System.out.println("####### Records Changed in DB : "+size);
            email.sendMail();               
        }else {
            System.out.println("Records not added/removed. "+currSize);
        }
         (or base on dates)
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        String today = dateFormat.format(new Date());
        System.out.println("Current Day : "+today);

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date()); // Current date
        int numOfDays = cal.get(Calendar.DAY_OF_YEAR);
        System.out.println("Day of Year : "+numOfDays);

        Date edate = dateFormat.parse("27/10/2015");
        System.out.println("End Date : "+edate);
        cal.setTime(edate);  // Future Date
        int numOfpdays = cal.get(Calendar.DAY_OF_YEAR);
        final int fireTrigger = numOfpdays - numOfDays;
        System.out.println("Shedlue : "+fireTrigger);
        //if(fireTrigger > 0 && fireTrigger < 10 ){ //send a mail.. }   
    //...
}
  • Si le temps de déclenchement est moins il ne peut pas exécuter complètement la méthode, car avant d'obtenir la réponse suivante déclencheur peut soulever.

  • code
  • demande de passer à DBS, mais pas geeting arrière et si l'exécution {}. peut-on peut résoudre ce problème.

annotations .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top