Как установить время сервера для ScheduledTimerTask весной?
-
26-10-2019 - |
Вопрос
Мы используем 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{}.может ли кто-нибудь это исправить.
с использованием аннотации.