DisallowConcurrentExecution

DisallowConcurrentExecution

我正在使用Java石英时间表。我能够完美地安排作业,尽管我想要的是等待作业完成再运行第二轮,因为运行每个作业所需的时间各不相同。

我使用了@DisallowConcurrentExecution,它所做的只是使作业一次运行,而不再运行。来自作业侦听器的信息显示该作业成功完成了一次。

Job
=============================================================

@DisallowConcurrentExecution
public class SalesJob implements Job{
    List<Transaction> unsentTransaction = new ArrayList<Transaction>();
    List<Sale> sales = new ArrayList<Sale>();

    public void execute(JobExecutionContext jec) throws JobExecutionException {
        System.out.println("Sales Job. . .");
    }
}


作业侦听器:

public class SalesJobListener implements JobListener{
public static final String LISTENER_NAME = "dummyJobListenerName";

public String getName() {
    return LISTENER_NAME;
}

public void jobToBeExecuted(JobExecutionContext context) {
    String jobName = context.getJobDetail().getKey().toString();
System.out.println("jobToBeExecuted");
System.out.println("Job : " + jobName + " is going to start...");
}

public void jobExecutionVetoed(JobExecutionContext jec) {
    System.out.println("jobExecutionVetoed");
}

public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
    System.out.println("jobWasExecuted");
    String jobName = context.getJobDetail().getKey().toString();
    System.out.println("Job : " + jobName + " is finished...");
    System.out.println("=====================================");
    System.out.println("==========" + new Date() + "===========");

    if (!jobException.getMessage().equals("")) {
            System.out.println(
                    "Exception thrown by: " + jobName + " Exception: " + jobException.getMessage());
    }
}

}


这是时间表

JobKey salesJobKey = new JobKey("salesJob", "group1");
    JobDetail salesJob = JobBuilder.newJob(SalesJob.class)
    .withIdentity(salesJobKey).build();

    Trigger salesTrigger = TriggerBuilder
                            .newTrigger()
                            .withIdentity("salesTrigger", "group1")
                            .withSchedule(
                                    CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                            .build();

    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    scheduler.getListenerManager().addJobListener(
        new SalesJobListener(), KeyMatcher.keyEquals(salesJobKey)
    );

    scheduler.start();
    scheduler.scheduleJob(salesJob, salesTrigger);

最佳答案

问题


  它执行的时间是EAT 2015年11月25日星期三12:01:15,现在是2015年11月25日星期三12 :,所以基本上我已经等了> 30分钟。 。 。而且没有别的工作


就是说Scheduler不起作用。

为什么?


您无法在每分钟的15分钟执行任务,因为模式:0/5 * * * * ?使调度程序仅在每分钟的0和5秒运行。
如果已经在运行相同类型的另一个,使用@DisallowConcurrentExecution将阻止执行作业。




解:

错误是按照代码的顺序执行的,然后执行调度程序(scheduler.start();),然后告知必须调度作业(scheduler.scheduleJob(salesJob, salesTrigger);):

scheduler.start();
scheduler.scheduleJob(salesJob, salesTrigger);


检查this example并交换行:

scheduler.scheduleJob(salesJob, salesTrigger);
scheduler.start();


就这样...

09-16 06:56