如何处理同一个石英调度程序的两个触发器
how handle two triggers to same quartz scheduler
我有 quartz 调度程序,我已经为指定时间(每天)创建了一个触发器。而且我还为另一个指定时间创建了另一个触发器(每三个月一次)
下面是我将两个触发器安排到单个调度程序的代码。
Scheduler sch = new StdSchedulerFactory().getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MFRScheduler.class)
.withIdentity("firstJob", "group1").build();
JobDetail jobDetail1 = JobBuilder.newJob(MFRScheduler.class)
.withIdentity("cleanTrigger", "group2").build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("firstJob", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(schduledTime))
.build();
Trigger houseKeepingTrigger = TriggerBuilder
.newTrigger()
.withIdentity("mfrJobHouseKeeping","group2")
.withSchedule(
CronScheduleBuilder.cronSchedule(cleanTrigerTime)
)
.build();
sch.start();
sch.scheduleJob(jobDetail, trigger);
sch.scheduleJob(jobDetail1, cleanTrigger);
我已经覆盖了 org.quartz.Job
execute()
的方法
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
_log.info("--- This is in Execute method");
try{
Thread thread = new Thread(new FIRSTProcess("FIRST_THREAD"),"thread2");
thread.start();
thread.setName("FIRST_THREAD");
thread = null;
Thread.sleep(3000);
}catch(Exception e)
{
e.printStackTrace();
}
我的问题在这里 一个触发器每天触发,execute()
方法中的内容将执行,因为我只有一个方法 execute()
将执行两个触发器。
我需要的是 execute
方法中的内容应该只在我的 firstTrigger
触发时执行 当我的第二个触发器触发时 我想做一些其他的事情而不是重复 firstTrigger
能否解释一下如何隔离两个触发器的工作。
提前致谢
因为你想做不同的工作,我建议创建不同的作业实现(例如 MFRSchedulerHouseKeeping.class)。然后您可以将您想要的触发器分配给特定的作业。
Scheduler sch = new StdSchedulerFactory().getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MFRScheduler.class)
.withIdentity("firstJob", "group1").build();
JobDetail jobDetail1 = JobBuilder.newJob(MFRSchedulerHouseKeeping.class)
.withIdentity("houseKeepingJob", "group2").build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("firstJob", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(schduledTime))
.build();
Trigger houseKeepingTrigger = TriggerBuilder
.newTrigger()
.withIdentity("mfrJobHouseKeeping","group2")
.withSchedule(
CronScheduleBuilder.cronSchedule(cleanTrigerTime)
)
.build();
sch.start();
sch.scheduleJob(jobDetail, trigger);
sch.scheduleJob(jobDetail1, cleanTrigger);
另一种方法是通过 getTrigger()
从 JobExecutionContext
查询触发器并根据结果执行适当的工作。
@Override
public void execute(JobExecutionContext context ) throws JobExecutionException {
final String triggerName = context.getTrigger().getKey().getName();
if (TRIGGER_NAME_1.equals(triggerName)) {
// do work ...
}
// other cases...
}
我有 quartz 调度程序,我已经为指定时间(每天)创建了一个触发器。而且我还为另一个指定时间创建了另一个触发器(每三个月一次)
下面是我将两个触发器安排到单个调度程序的代码。
Scheduler sch = new StdSchedulerFactory().getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MFRScheduler.class)
.withIdentity("firstJob", "group1").build();
JobDetail jobDetail1 = JobBuilder.newJob(MFRScheduler.class)
.withIdentity("cleanTrigger", "group2").build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("firstJob", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(schduledTime))
.build();
Trigger houseKeepingTrigger = TriggerBuilder
.newTrigger()
.withIdentity("mfrJobHouseKeeping","group2")
.withSchedule(
CronScheduleBuilder.cronSchedule(cleanTrigerTime)
)
.build();
sch.start();
sch.scheduleJob(jobDetail, trigger);
sch.scheduleJob(jobDetail1, cleanTrigger);
我已经覆盖了 org.quartz.Job
execute()
的方法
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
_log.info("--- This is in Execute method");
try{
Thread thread = new Thread(new FIRSTProcess("FIRST_THREAD"),"thread2");
thread.start();
thread.setName("FIRST_THREAD");
thread = null;
Thread.sleep(3000);
}catch(Exception e)
{
e.printStackTrace();
}
我的问题在这里 一个触发器每天触发,execute()
方法中的内容将执行,因为我只有一个方法 execute()
将执行两个触发器。
我需要的是 execute
方法中的内容应该只在我的 firstTrigger
触发时执行 当我的第二个触发器触发时 我想做一些其他的事情而不是重复 firstTrigger
能否解释一下如何隔离两个触发器的工作。
提前致谢
因为你想做不同的工作,我建议创建不同的作业实现(例如 MFRSchedulerHouseKeeping.class)。然后您可以将您想要的触发器分配给特定的作业。
Scheduler sch = new StdSchedulerFactory().getScheduler();
JobDetail jobDetail = JobBuilder.newJob(MFRScheduler.class)
.withIdentity("firstJob", "group1").build();
JobDetail jobDetail1 = JobBuilder.newJob(MFRSchedulerHouseKeeping.class)
.withIdentity("houseKeepingJob", "group2").build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("firstJob", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(schduledTime))
.build();
Trigger houseKeepingTrigger = TriggerBuilder
.newTrigger()
.withIdentity("mfrJobHouseKeeping","group2")
.withSchedule(
CronScheduleBuilder.cronSchedule(cleanTrigerTime)
)
.build();
sch.start();
sch.scheduleJob(jobDetail, trigger);
sch.scheduleJob(jobDetail1, cleanTrigger);
另一种方法是通过 getTrigger()
从 JobExecutionContext
查询触发器并根据结果执行适当的工作。
@Override
public void execute(JobExecutionContext context ) throws JobExecutionException {
final String triggerName = context.getTrigger().getKey().getName();
if (TRIGGER_NAME_1.equals(triggerName)) {
// do work ...
}
// other cases...
}