我正在使用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();
就这样...