У меня есть пользовательский 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