2

私はクォーツジョブのために次の設定をしています -

    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="actualObject" /><br>
    <property name="targetMethod" value="processData"/>
    <property name="concurrent" value="false"/>
</bean>

    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <property name="jobDetail" ref="jobDetail" />
    <property name="startDelay" value="10000" />
    <property name="repeatInterval" value="1000" />
</bean>

そして、これは私にとってはうまくいきます。私がやりたいことは、終了したらすぐに processData をもう一度呼び出すことです。古き良きwhile(true)メソッドが最適であることは知っていますが、クォーツでこれを行いたいです。

4

1 に答える 1

4

まず最初に、「古き良き while(true) 」がユースケースを実装する正しい方法であるため、「 Quartz でこれを実行したい」理由を説明する必要があります (もちろん、追加のスレッドが必要ですが、Quartz にはそれも必要です) )。オーバーエンジニアリングのように聞こえるので、正当な理由が必要です。

つまり、次の 2 つの選択肢があります。

  • ジョブを終了したときにすぐに実行されるようにジョブを再スケジュールします。原則として:

    public class HelloJob implements Job {
    
        public HelloJob() {
        }
    
        public void execute(JobExecutionContext context) throws JobExecutionException
        {
            //do your job...
    
            Trigger trigger = newTrigger().build();
            JobDetail job = newJob(HelloJob.class).build();
            context.getScheduler().scheduleJob(trigger, job);
        }
    }
    

    XML 構成は必要ありませんが、このジョブを何らかの方法で初めて実行するようにスケジュールする必要があります (直接@PostConstruct使用する場合など)。Schedulerジョブが終了すると、再スケジュールされたばかりの同じジョブが再び実行されます。

  • JobChainingJobListenerあなたのために働くかもしれません、見てください:Quartz Scheduler Run jobs serially?

どちらのソリューションも、「古き良き while(true)」と比較して非常に重量があります。

于 2012-08-30T16:24:57.990 に答える