Как установить время сервера для ScheduledTimerTask весной?

StackOverflow https://stackoverflow.com/questions/8337279

Вопрос

Мы используем ScheduledTimerTask для управления заданиями (автоматическими) в нашем приложении. Мы используем следующий код:

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

Используя приведенный выше код runMethod каждую минуту работает нормально. Но мы хотели бы изменить выполнение в зависимости от времени сервера. Например, если время на сервере 18:00, нам нужно вызвать функцию. Как этого добиться?

Помощь будет оценена по достоинству.

Это было полезно?

Решение

Вы можете использовать триггер Task Spring, чтобы вызвать в период Certian Time, вы можете использовать CronTrigger.

Подробная документация здесь

Другие советы

Если вам нужно использовать только запланированнуютимитов, то вызовите задачу таймера раз в минуту. Теперь из задачи таймера проверьте, будет ли время 6 утра, и запустите необходимую функциональность. Иначе вернуться.

CON: Эта задача, которая не является OP, будет выполняться на каждую минуту (за исключением случаев, когда она должна выполнять некоторую обработку.

ИЛИ ЖЕ

Вызовите схему только один раз с весны. Когда задача выполнена, вы можете получить текущее время и можете вычислить разницу между текущим временем и временем для выполнения фактической задачи. (Пусть это различие будет названо задержкой).

Теперь, в соответствии с этой задачей таймера, запустите нового исполнителя исполнителей. NewschedudThreadPool (1) и PradeAteAtFixEdRate с интенсивной задержкой = задержка и установите период как 1 день

Планировщик Spring QuartzFactoryBean

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>

метод конкретного класса, который будет выполняться, как настроено в 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.. }   
    //...
}
  • Если время триггера очень меньше, метод может не выполниться полностью, поскольку до получения ответа может сработать следующий триггер.

  • передача запроса в DBS, но без возврата и выполнения кода if{}.может ли кто-нибудь это исправить.

с использованием аннотации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top