Запланировано 2 кварцевых задания, но только одно выполнено дважды - PullRequest
0 голосов
/ 25 января 2019

У меня есть пользовательский Job с пользовательским JobFactory, поэтому каждое задание может иметь разные параметры (здесь: запись в другой файл).Но когда я планирую разные задания с одним и тем же классом, выполняется только позднее запланированное, но дважды.Я даже пытался продублировать весь код, дважды расширив свое пользовательское задание, чтобы MyJob.class могло отличаться в JobBuilder, но это была та же проблема.Даже если каждая фабрика получает свой собственный класс и много дублирования кода, она все равно просто выполняет одно задание.

public class TripJob implements Job {

    private TripParser parser;
    private CsvWriter writer;

    public TripJob() {

    }

    public void setParser(TripParser parser) {
        this.parser = parser;
    }

    public void setWriter(CsvWriter writer) {
        this.writer = writer;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        if (parser == null || writer == null) throw new JobExecutionException(getClass().getName() + "'s parser and/or writer not set");
        String result = parser.getResult();
        writer.write(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + result);
    }
}

...

public class TripJobFactory extends SimpleJobFactory {

    private final TripParser parser;
    private final CsvWriter writer;

    public TripJobFactory(TripParser parser, CsvWriter writer) {
        this.parser = parser;
        this.writer = writer;
    }

    @Override
    public Job newJob(TriggerFiredBundle bundle, Scheduler Scheduler) throws SchedulerException {
        TripJob job = (TripJob) super.newJob(bundle, Scheduler);
        if (parser == null || writer == null) throw new SchedulerException(getClass().getName() + "'s parser and/or writer not set");
        job.setParser(parser);
        job.setWriter(writer);
        return job;
    }
}

...

public class TripScheduler {

    private final TripJobFactory factory;

    public TripScheduler(TripJobFactory factory) {
        this.factory = factory;
    }

    public void scheduleJob(String schedule) throws SchedulerException {
        var scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();

        var jobDetail = JobBuilder.newJob(TripJob.class)
                .build();

        var trigger = TriggerBuilder.newTrigger()
                .startNow()
                //.withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 * * * ?"))
                .withSchedule(CronScheduleBuilder.cronSchedule(schedule))
                .build();

        scheduler.setJobFactory(factory);
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

В моем основном классе я звоню

    var toParser = new TripParser(toUrl);
    var toWriter = new CsvWriter("logs/to.csv");
    var toFactory = new TripJobFactory(toParser, toWriter);
    var toScheduler = new TripScheduler(toFactory);

    var fromParser = new TripParser(fromUrl);
    var fromWriter = new CsvWriter("logs/from.csv");
    var fromFactory = new TripJobFactory(fromParser, fromWriter);
    var fromScheduler = new TripScheduler(fromFactory);

    try {
        toScheduler.scheduleJob("0 * * * * ?");
        fromScheduler.scheduleJob("30 * * * * ?");
    } catch (SchedulerException e) {
        e.printStackTrace();
    }

Выходное значение равно

Wrote '19:53:34;24.0;Min.;24.3;km' to: logs/from.csv
Wrote '19:54:04;24.0;Min.;24.3;km' to: logs/from.csv

Но должно быть

Wrote '19:53:34;24.0;Min.;24.3;km' to: logs/from.csv
Wrote '19:54:04;25.0;Min.;25.3;km' to: logs/to.csv
...