#java #spring #spring-boot
#java #spring #spring-загрузка
Вопрос:
Мне нужно передать время выполнения значения и в соответствии со значением мне нужно изменить интервалы выполнения cronjob, но когда я использую @Scheduled(), и я не могу этого сделать, поскольку для этого требуется константа. Как я могу это сделать или есть ли какой-либо альтернативный способ? Я также не могу присвоить значение env.getProperty переменной вне локального метода.
String cronValue=env.getProperty("cron");
@Override
@Scheduled(cron = "0 0 0 * * *", zone = "Asia/Colombo")
public void createFile() throws IOException {
String location=env.getProperty("location");
LocalDate today = LocalDate.now( ZoneId.of( "Asia/Colombo" ) );
String date = today.toString();
String source=location "report-temp.csv";
String dailyFile=location "report-" date ".csv";
// File (or directory) with old name
File oldFile = new File("/home/lkr/nish/report-temp.csv");
File newFile = new File(dailyFile);
//if(file2.exists()) throw new java.io.IOException("file exists");
boolean success = oldFile.renameTo(newFile);
if (!success) {
// File was not successfully renamed
}
System.out.println("Daily File Created!");
}
Ответ №1:
Хммм, вы могли бы попробовать использовать весенний интерфейс TaskScheduler.
По сути, это позволяет вам вызывать метод schedule и передавать параметры Runnable и Date.
В этом случае ваши вызовы должны реализовывать Runnable и параметризовать ваши динамические периоды выполнения в формате даты. Допустим, у вас есть класс с именем FileGenerator и что он реализует Runnable . Он также должен будет реализовывать методы Runnable interfance, следовательно, у вас должен быть метод с именем run();
class FileGenerator implements Runnable {
TaskScheduler scheduler;
Date parametrizedDate;
@Override
public void run() {
scheduler.schedule(this::createFile, parametrizedDate);
}
private void createFile() {
String location=env.getProperty("location");
LocalDate today = LocalDate.now( ZoneId.of( "Asia/Colombo" ) );
String date = today.toString();
String source=location "report-temp.csv";
String dailyFile=location "report-" date ".csv";
// File (or directory) with old name
File oldFile = new File("/home/lkr/nish/report-temp.csv");
File newFile = new File(dailyFile);
//if(file2.exists()) throw new java.io.IOException("file exists");
boolean success = oldFile.renameTo(newFile);
if (!success) {
// File was not successfully renamed
}
System.out.println("Daily File Created!");
}
Поскольку TaskScheduler сам по себе является интерфейсом, вам нужно будет настроить одну из его реализаций, предпочтительно в bean. Одна из возможностей сделать это с помощью ThreadPoolTaskScheduler:
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
return threadPoolTaskScheduler;
}
Все, что осталось сделать, это автоматически подключить компонент к полю и указать дату, которую вы хотите передать.
РЕДАКТИРОВАТЬ: этот интерфейс также предоставляет вам методы, которым вы можете передать интервал времени (фиксированный или с задержкой). Немного подробнее об этом здесь