首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >石英企业计划:计划自己的工作

石英企业计划:计划自己的工作
EN

Stack Overflow用户
提问于 2011-01-28 22:34:09
回答 1查看 5.5K关注 0票数 1

我正在使用Quartz企业作业计划程序(1.8.3)。作业配置来自几个xml文件,我们有一个特殊的任务来检测这些xml文件中的更改并重新安排作业。这很好用,但问题是我也需要这个“调度器作业”来重新调度自己。一旦这份工作重新安排,出于某种原因,我看到它被执行了很多次。不过,我没有看到任何例外。

我复制并孤立了这个问题。这将是一个切入点:

代码语言:javascript
复制
public class App {
    public static void main(final String[] args) throws ParseException, SchedulerException {
    // get the scheduler from the factory
    final Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

    // start the scheduler
    scheduler.start();

    // schedule the job to run every 20 seconds
    final JobDetail jobDetail = new JobDetail("jobname", "groupname", TestJob.class);        
    final Trigger trigger = new CronTrigger("triggername", "groupname", "*/20 * * * * ?");

    // set the scheduler in the job data map, so the job can re-configure itself
    jobDetail.getJobDataMap().put("scheduler", scheduler);

    // schedule job
    scheduler.scheduleJob(jobDetail, trigger);

    }
}

这将是一种职业:

代码语言:javascript
复制
public class TestJob implements Job {

private final static Logger LOG = Logger.getLogger(TestJob.class);
private final static AtomicInteger jobExecutionCount = new AtomicInteger(0);

public void execute(final JobExecutionContext context) throws JobExecutionException {
    // get the scheduler from the data map
    final Scheduler scheduler = (Scheduler) context.getJobDetail().getJobDataMap().get("scheduler");
    LOG.info("running job! " + jobExecutionCount.incrementAndGet());

    // buid the job detail and trigger
    final JobDetail jobDetail = new JobDetail("jobname", "groupname", TestJob.class);
    // this time, schedule it to run every 35 secs
    final Trigger trigger;
    try {
        trigger = new CronTrigger("triggername", "groupname", "*/50 * * * * ?");
    } catch (final ParseException e) {
        throw new JobExecutionException(e);
    }
    trigger.setJobName("jobname");
    trigger.setJobGroup("groupname");

    // set the scheduler in the job data map, so this job can re-configure itself
    jobDetail.getJobDataMap().put("scheduler", scheduler);

    try {
        scheduler.rescheduleJob(trigger.getName(), jobDetail.getGroup(), trigger);
    } catch (final SchedulerException e) {
        throw new JobExecutionException(e);
    }
}
}

我尝试过scheduler.rescheduleJobscheduler.deleteJob,然后是scheduler.scheduleJob。无论我做什么,这都是我得到的输出(我正在使用log4j):

代码语言:javascript
复制
23:22:15,874         INFO SchedulerSignalerImpl:60 - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
23:22:15,878         INFO QuartzScheduler:219 - Quartz Scheduler v.1.8.3 created.
23:22:15,883         INFO RAMJobStore:139 - RAMJobStore initialized.
23:22:15,885         INFO QuartzScheduler:241 - Scheduler meta-data: Quartz Scheduler (v1.8.3) 

'MyScheduler' with instanceId '1'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

23:22:15,885         INFO StdSchedulerFactory:1275 - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
23:22:15,886         INFO StdSchedulerFactory:1279 - Quartz scheduler version: 1.8.3
23:22:15,886         INFO QuartzScheduler:497 - Scheduler MyScheduler_$_1 started.
23:22:20,018         INFO TestJob:26 - running job! 1
23:22:50,004         INFO TestJob:26 - running job! 2
23:22:50,010         INFO TestJob:26 - running job! 3
23:22:50,014         INFO TestJob:26 - running job! 4
23:22:50,016         INFO TestJob:26 - running job! 5
...
23:22:50,999         INFO TestJob:26 - running job! 672
23:22:51,000         INFO TestJob:26 - running job! 673

注意,在23:22:20,018,作业运行良好。此时,作业重新安排自己,每50秒运行一次。下次它运行时( 23:22:50,004),它会被排定数百次。

对于如何在执行作业时配置作业,有什么想法吗?我做错了什么?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-29 02:10:16

很简单。

首先,你对Cron的表达有一些误解。"*/20 *** ?“正如注释所暗示的,每20秒是一次,但这只是因为60可以被20整除。"/50 .“不是每50秒一次。它是每分钟的0和50秒。作为另一个例子,"/13 .“是每分钟的0、13、26、39和52秒--所以在第52秒和下一分钟的0秒钟之间,只有8秒,而不是13秒。因此,用*/50,每隔一次射击你就能得到50秒,其他每一次发射就有10秒。

然而,这并不是你迅速解雇这份工作的原因。问题是,当前的秒是"50",而您正在调度新的触发器在第二个"50“上触发,因此它立即触发。然后它仍然是第二个50,作业再次执行,它计划在第二个50上触发另一个触发器,以此类推,在第50秒期间尽可能多地执行。

您需要将触发器的启动时间设置为未来(至少1秒),否则如果调度时间与当前秒相匹配,触发器将在调度的同一秒钟内触发。

另外,如果您确实需要每一个"N“秒类型的时间表,我建议您使用SimpleTrigger而不是CronTrigger。SimpleTrigger可以做“每35秒”或“每50秒”没有问题。CronTrigger指的是“每个一月的星期一10点15分15分40分43秒”这样的表达方式。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4833713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档