春に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
1分ごとに正常に動作していますが、サーバーの時間に基づいて実行を変更したいと思います。たとえば、サーバーの時間が午後6時の場合、関数を呼び出す必要があります。
助けていただければ幸いです。
解決
スプリングのタスクトリガーを使用して、certian期間に呼び出すことができます。 CronTrigger
.
詳細なドキュメントはです ここ
他のヒント
ScheduleDtimertaskのみを使用する必要がある場合は、1分に1回タイマータスクを呼び出します。次に、タイマータスク内から、時間が午前6時かどうかを確認し、必要な機能を実行します。それ以外の場合は戻ります。
CON:No-opであるこのタスクは、毎分で実行されます(一度に処理する必要があることを除きます。
また
春からタイムテスクを一度だけ呼び出します。タスクが実行されると、現在の時間を取得し、現在の時間と時間の差を計算して実際のタスクを実行できます。 (この違いを遅延と呼びます)。
このタイマータスクでは、新しいエグゼクターエグゼクティアを開始します。NewScheduleDthreadPool(1)とscheduleatfixedrate intial Delay = delayを使用して、期間を1日として設定します
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>
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に渡すことをリクエストしますが、{}コードの場合はジートして実行しません。誰でもこれを修正できますか。
使用 注釈.