Quartz如何把多个触发器绑定到一个任务上?

Lucare 发布于 2016/10/21 17:32
阅读 1K+
收藏 0
public static void sendEmailForNewTrigger(String jobName, String triggerName, Date sendDate) {
        try {
            Scheduler sched = QuartzSchedulerManager.getInstanceScheduler();
            JobKey jobKey = JobKey.jobKey(jobName, "group_email");
            JobDetail job = sched.getJobDetail(jobKey);
            SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity(triggerName)
                    .startAt(sendDate)
                    .build();
            if (job == null) {
                job = newJob(SendEmailJob.class).withIdentity(jobName, "group_email").build();
            }
            sched.scheduleJob(job, trigger);
            log.info(jobName + " will run at: " + sendDate);

        } catch (SchedulerException e) {
            log.error(e.toString());
            throw new RuntimeException(e.getMessage());
        }
    }

代码如上,我想在某个特定时间发邮件,一封邮件的内容需要设置多个时间点发送,这样就需要多个trigger,job只需要一个,但是怎样才能把多个trigger关联到一个job,我想多次调用上面的方法,有job则拿,没有则创建,但是一直报错--Unable to store Job : 'group_email.send_1', because one already exists with this identification.

用下面的方法也不行:

Scheduler sched = QuartzSchedulerManager.getInstanceScheduler();
JobDetail job = newJob(SendEmailJob.class).withIdentity("send1", "group_email").build();
SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group_email")
                .startAt(new Date())
                .build();
SimpleTrigger trigger2 = (SimpleTrigger) newTrigger().withIdentity("trigger2", "group_email")
                .forJob("send1")
                .startAt(new Date())
                .build();
try {
     sched.scheduleJob(job, trigger);
     sched.scheduleJob(trigger2);
} catch (SchedulerException e) {
     e.printStackTrace();
}



报错--org.quartz.JobPersistenceException: The job (DEFAULT.send1) referenced by the trigger does not exist.


我的版本是2.2.x 请问到底该怎么做?



加载中
0
Lucare
Lucare
QuartzManager.start();

Scheduler sched = QuartzManager.getInstanceScheduler();

JobDetail job = newJob(MyJob.class)
        .withIdentity("myJob", "group1")
//      .storeDurably()
        .build();
// sched.addJob(job, false);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

System.out.println("开始时间: " + sdf.format(new Date()));

SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group1")
//       .forJob(jobKey("myJob", "group1"))
         .startAt(sdf.parse("2016-10-22 22:07:30"))
         .build();

SimpleTrigger trigger2 = (SimpleTrigger) newTrigger().withIdentity("trigger2", "group1")
         .forJob(jobKey("myJob", "group1"))
//       .forJob("myJob")这是错误关键   没有指定组 
         .startAt(sdf.parse("2016-10-22 22:07:38"))
          .build();

sched.scheduleJob(job, trigger);
// sched.scheduleJob(trigger);

sched.scheduleJob(trigger2);

因为用的新版,网上的demo都是老版本,再就是没有forJob没有指定group名,所以一直报错。

后来看了下英文本的最新文档,才找到用法。

我觉得自己还是怂,没有当年的劲头了,因为最新文档是英文就不敢去看,结果耽误那么多时间,今天扫了下文档一下子就找到原因了,还像个sb似的问这问那!

0
Mwww
Mwww
你描述错了,应该是job多个,而job的实现类是同一个,所以需要添加多个job,每个job对应不同的trigger
Lucare
Lucare
回复 @Mwww :我知道,但是我一个邮件设置包括它的内容都不会变,唯一不同的是定时发送的时间不同,我想把这个邮件设置的key作为jobname,然后把不同的时间设置为不同的trigger,绑定到一个job上,这样不行吗?
Mwww
Mwww
回复 @Lucare : quartz是调度框架,只负责在指定时间,调用作业,不负责处理你的业务
Lucare
Lucare
但是一个job需要两个或者更多的触发器,就是一封邮件可以反复多次定时发送,这不是一个job对应多个触发器吗
返回顶部
顶部