Привет, ребята, я работаю над весенним пакетом с планированием (используя триггер cron), он работает, но со следующими ошибками:
- давайте предположим, что значение cron запускает пакет каждые 10 секунд, когда я запускаю первый и после, например, 3 секунды, я запускаю еще один, spring не будет знать о промежутке в 3 секунды, и он запустит их оба, как я запустили их одновременно
вот мой код
это класс работы, которую я запущу
@Component
public class JobThread implements Runnable {
@Autowired
private JobLauncher jobLauncher;
@Autowired
@Lazy
private Job job;
public JobParameters jobParameters;
private Logger log = Logger.getLogger(JobThread.class);
public synchronized void runBatch() {
jobParameters = new JobParametersBuilder().addLong("LaunchTime", System.currentTimeMillis())
.addString("TenantID", BatchController.getCurrentTenant().get()).toJobParameters();
try {
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
log.info("Job's Status:::" + jobExecution.getStatus());
} catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
| JobParametersInvalidException e) {
e.printStackTrace();
}
}
@Override
public void run() {
this.runBatch();
}
}
контроллер, который будет вызывать задание
@RestController
@RequestMapping("tenant/batch")
public class BatchController {
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
@Autowired
@Qualifier("threadPoolTaskExecutor")
private ThreadPoolTaskExecutor taskExecutor;
@Autowired
private JobThread jobThread;
private static ThreadLocal<String> currentTenant;
@PostMapping("/schedule")
public void setBatch(@RequestBody BatchBean cron) {
currentTenant = new ThreadLocal<String>() {
@Override
protected String initialValue() {
new TenantContext();
return TenantContext.getCurrentTenant();
}
};
//cron = "*/10 * * * * *";
taskScheduler.schedule(taskExecutor.createThread(jobThread), new CronTrigger(cron.getCron()));
}
Я надеюсь, что я был достаточно ясен. Спасибо заранее.
ThreadLocal
и не воссоздавай свойJobParamaters
. Только последний останется. Так что это опасно. Также вы должны программировать интерфейсы, а не конкретные реализации. Создавать поток для исполняемого файла не нужно, так как вашJobThread
уже являетсяRunnable
. - person M. Deinum   schedule 31.03.2020