¿Cómo establecer el tiempo del servidor para ProchuledtimerTask en la primavera?
-
26-10-2019 - |
Pregunta
Estamos utilizando ProchuledTimerTask para administrar los trabajos (automáticos) en nuestra aplicación. Estamos utilizando el siguiente código:
<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>
Mediante el código anterior runMethod
está funcionando bien por cada minuto. Pero nos gustaría cambiar la ejecución en función del tiempo del servidor. Por ejemplo, si el tiempo en el servidor es de las 6 pm, entonces debemos invocar la función. ¿Cómo lograrlo?
La ayuda sería apreciada.
Solución
Puede usar el disparador de tareas de la primavera para invocar en un período de tiempo certiano, puede usar CronTrigger
.
La documentación detallada es aquí
Otros consejos
Si tiene que usar solo ProchuledtimerTask, invoque la tarea del temporizador una vez por minuto. Ahora desde la tarea del temporizador, verifique si el tiempo es a las 6 a.m. y ejecuta la funcionalidad necesaria. De lo contrario regresar.
Con: esta tarea que no es-op se ejecutará por cada minuto (excepto una vez que tiene que hacer algún procesamiento.
O
Invoca la tarea de horario solo una vez desde la primavera. Cuando se ejecuta la tarea, puede obtener el tiempo actual y puede calcular la diferencia entre el tiempo actual y el tiempo para ejecutar la tarea real. (Deje que esta diferencia se llame demora).
Ahora desde con esta tarea de temporizador, inicie un nuevo ejecutores de ejecutores.
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>
Método de clase perticular que se ejecutará según lo configurado 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 el tiempo de activación es muy menor, puede no ejecutar el método por completo, porque antes de obtener la respuesta, el siguiente activador puede aumentar.
Solicite pasar a DBS pero no recurrir y ejecutar el código {}. ¿Alguien puede solucionar esto?
usando anotaciones.