【发布时间】:2016-01-17 08:11:42
【问题描述】:
我正在使用带有 cron 的石英来安排 2 个作业。一个在 12:00 运行,另一个在 14:00 运行,并且运行良好。这是我的代码。
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
JobDetail job1 = JobBuilder.newJob(FirstInvoiceGeneration.class)
.withIdentity("FirstInvoiceGenerationJob", "group1").build();
Trigger trigger1 = TriggerBuilder
.newTrigger()
.withIdentity("FirstInvoiceGenerationTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")).build();
//Simple invoice generation to check which invoice to be generated today
JobDetail job2 = JobBuilder.newJob(TodayInvoiceGeneration.class)
.withIdentity("TodayInvoiceGenerationJob", "group1").build();
Trigger trigger2 = TriggerBuilder
.newTrigger()
.withIdentity("TodayInvoiceGenerationTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule(0 0 14 * * ?")).build();
//Schedule it
Scheduler scheduler;
try {
scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job1, trigger1);
scheduler.scheduleJob(job2, trigger2);
} catch (SchedulerException e) {
e.printStackTrace();
}
}}
我运行两个作业的两个类是:
public class FirstInvoiceGeneration implements Job {
@Override
public void execute(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("Listener running.");
}
}
我第二份工作的第二课是
public class FirstInvoiceGeneration implements Job {
@Override
public void execute(JobExecutionContext arg0)
throws JobExecutionException {
System.out.println("Listener running.");
}
}
现在这运行得很好,但我想做的是有一个运行这两个代码的工作。现在我可以使用这个 cron 表达式 --> "0 0 12,14 * * ?" 这将使工作在下午 12 点、下午 2 点运行(我猜:p)。但是我希望只有一个班级在下午 12 点时执行一个代码,而在下午 2 点执行另一个代码。那么有人可以告诉我该怎么做吗?
【问题讨论】:
-
你为什么想让它们在一个 cron 行中运行? (我能看到使其工作的唯一方法是让一个函数查看现在几点并决定调用哪个类,这太可怕了。)有正常的方法(两条 cron 行),还有奇怪的方法(一条 cron 行);如果您要问如何实现这种奇怪的方式,您还应该说明为什么您决定不采用正常方式。
-
您能否将命令行参数传递给您的应用程序以说明哪一段代码?
-
实际上我必须运行两个将运行 2-3 小时的大查询,所以先生说这两个工作可能会相互冲突。他说可能不是线程安全的。是吗?我对石英和所有这一切都非常陌生。所以他说最好在一份工作中做到这一点以确保安全。