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 也需要它)。这听起来像是过度设计,所以你最好有充分的理由。

话虽如此,您有两个选择:

  • 重新安排作业以在您离开时立即运行。原则:

    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 可以串行运行作业吗?

与“ good old while(true) ”相比,这两种解决方案都非常重量级。

于 2012-08-30T16:24:57.990 回答