2

アプリケーションのジョブ(自動)を管理するために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時の場合、関数を呼び出す必要があります。それを実現するにはどうすればよいですか。

助けていただければ幸いです。

4

3 に答える 3

1

Springのタスクトリガーを使用して、certian期間に呼び出すことができます。を使用できますCronTrigger

詳細なドキュメントはこちら

于 2011-12-01T06:57:22.330 に答える
1

ScheduledTimerTaskのみを使用する必要がある場合は、タイマータスクを1分に1回呼び出します。タイマータスク内から、時刻が午前6時かどうかを確認し、必要な機能を実行します。それ以外の場合は戻ります。

短所:NO-OPであるこのタスクは、1分ごとに実行されます(処理を実行する必要がある場合を除く)。

また

春から一度だけTimeTaskを呼び出します。タスクが実行されると、現在の時刻を取得し、現在の時刻と実際のタスクを実行する時刻との差を計算できます。(この違いをDELAYと呼びます)。

このタイマータスクで、新しいExecutor Executors.newScheduledThreadPool(1)とscheduleAtFixedRateを初期遅延= DELAYで開始し、期間を1日に設定します。

于 2012-09-07T03:09:53.083 に答える
0

スプリングクォーツ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に渡すことを要求しますが、if{}コードを返して実行しません。誰でもこれを修正できますか。

注釈を使用します。

于 2015-07-07T14:28:23.010 に答える