简体   繁体   English

如何处理同一石英调度程序的两个触发器

[英]how handle two triggers to same quartz scheduler

I have quartz scheduler and I have created a trigger for specified time(Every day). 我有石英调度程序,并且已经为指定的时间(每天)创建了一个触发器。 And I also created another trigger for another specified time (Every three months once) 我还为另一个指定的时间(每三个月一次)创建了另一个触发器

Below is my code to schedule two triggers to single scheduler. 下面是我的代码,用于将两个触发器安排到单个计划程序中。

  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);

I have overided the method execute() of org.quartz.Job 我已经覆盖了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();


    }

What my question is here One trigger triggers every day and content in execute() method will execute, since I have only one method execute() will get executed for two triggers. 我在这里的问题是,每天只有一个触发器触发,并且execute()方法中的内容将执行,因为我只有一个方法execute()将针对两个触发器执行。

What I need is the content in execute method should get executed only when my firstTrigger triggers when my second trigger triggers I would like to do some other things instead of making duplicate work of firstTrigger Can please explain how to segergate the two triggers work. 我需要的是内容的execute ,只有当我应该得到执行的方法firstTrigger当我第二次触发触发我想这样做,而不是做重复的工作,其他一些东西触发firstTrigger能请解释如何segergate两个触发器工作。

Thanks in advance 提前致谢

As you want to do different work, I would suggest to create different implementations of the jobs (eg MFRSchedulerHouseKeeping.class). 当您要执行不同的工作时,我建议创建作业的不同实现(例如MFRSchedulerHouseKeeping.class)。 Then you can assign the triggers you want to the specific jobs. 然后,您可以将所需的触发器分配给特定作业。

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);

An alternative approach would be to query the Trigger from the JobExecutionContext via getTrigger() and do the appropriate work on behalf of the result. 一种替代方法是通过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...
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM