2

我正在使用 Quartz 来安排工作。工作是每天在某个特定时间(例如上午 11:00)发送提醒电子邮件。我能够成功发送提醒邮件,但问题是它同时发送超过 1 封邮件。有时它为 1 个提醒请求发送 8 封邮件,有时它发送 5 封邮件。似乎同一个作业被多次执行。

以下是我的代码,

JobDetail job = JobBuilder.newJob(LmsJob.class)
                .withIdentity("lmsJob", org.quartz.Scheduler.DEFAULT_GROUP)
                .build();

        JobDataMap map = job.getJobDataMap();
        map.put("creditMonthlyLeaveBalance", creditMonthlyLeaveBalance);
        map.put("dailyUpdationTask", dailyUpdation);
        map.put("monthlyPayrollGenerationTask",
                monthlyPayrollGenerationTask);
        map.put("yearlyMaintenanceOfLeaveBalance",
                yearlyMaintenanceOfLeaveBalance);
        map.put("emailNotifier", emailNotifier);
        try {
            CronTrigger trigger = TriggerBuilder
                    .newTrigger()
                    .withIdentity("lmsJob", "lmsJobGroup")
                    .forJob(job)
                    .startAt(new Date(System.currentTimeMillis()))
                    .withSchedule(
                            CronScheduleBuilder
                                    .cronSchedule("00 00 00 ? * *")).build();

            scheduler.scheduleJob(job, trigger);
            scheduler.start();

            // scheduler.shutdown();

        } catch (ParseException e) {
            e.printStackTrace();
        }

请帮助我,让我知道我是否需要其他任何东西。

4

1 回答 1

0

我不知道你的整个代码,你给出的注释和东西。所以,我猜你给出了像@QuartzEvery(“3h”)这样的注释。据我猜测,你的工作安排错了。要让它在每天的特定时间运行,试试这个......

QuartzManager implements Managed {
.
.
public void start() throws Exception {
.
.
QuartzDailyAt dailyAt = jobType.getAnnotation(QuartzDailyAt.class);
int hours[] = dailyAt.hours();
String hourString = 
Arrays.stream(hours).mapToObj(String::valueOf).collect(joining(","));
String cronExpression = String.format("0 0 %s * * ?", hourString);
Trigger trigger = TriggerBuilder.
                    newTrigger().
                    startNow().
                    withSchedule(CronScheduleBuilder.cronSchedule(cronExpression).
                            inTimeZone(TimeZone.getTimeZone("IST"))).
                    build();
scheduler.scheduleJob(JobBuilder.newJob(jobType).build(), trigger);
scheduler.start();
.
. 
}
.
}

和接口为

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface QuartzDailyAt {
    int[] hours(); 
}

在运行你的工作时,在类的顶部添加一个注释,比如

@QuartzDailyAt(hours = {7,8,9,15,16,17})
public class SomeJob extends QuartzJob {.....}

这使您可以在特定时区的每个特定间隔运行......(上面是 IST)

于 2019-02-06T11:25:45.187 回答