Запланировать время выполнения Cronjob- JAVA

#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;
    }
  

Все, что осталось сделать, это автоматически подключить компонент к полю и указать дату, которую вы хотите передать.

РЕДАКТИРОВАТЬ: этот интерфейс также предоставляет вам методы, которым вы можете передать интервал времени (фиксированный или с задержкой). Немного подробнее об этом здесь