Springboot @Scheduled Pauses - PullRequest
       6

Springboot @Scheduled Pauses

0 голосов
/ 24 апреля 2018

Я написал приложение Springboot для выполнения etl из источника данных в другое озеро данных каждые 15 минут. Я запланировал выполнение, используя @Scheduled аннотацию к функции.

Я создал jar и выполнял напрямую через java -jar ingest.jar. Работает нормально несколько дней (3-4 дня). И просто паузы без каких-либо исключений. Чтобы возобновить, я должен пойти и нажать любую клавишу, чтобы снова активировать ее.

@Scheduled(initialDelayString = "${ingest.initialdelay.in.seconds}000", fixedRateString = "${ingest.rate.in.seconds}000")
public void ingestData(){
    // Ingestion Logic
}

Поскольку проблема не устранена, я создал war и развернул ее на сервере Tomcat. Но проблема все еще остается.

Может кто-нибудь указать мне, что мне здесь не хватает? То же приложение отлично работает, если я разверну в cloudfoundry.

IO Streams - FileInputStream и FileOutputStream

Вспомогательные функции для ввода-вывода

public static void saveLastSuccessfulDate(String filepath, String propertyName, Date dateTime) {
    Properties prop = new Properties();
    OutputStream output = null;
    try {
        String lastDate = getDateInFormat(dateTime);
        log.info("Saving: " + lastDate);

        output = new FileOutputStream(filepath);

        prop.setProperty(propertyName, lastDate);

        prop.store(output, null);

    } catch (IOException io) {
        io.printStackTrace();
    } finally {
        if (output != null) {
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


//Helper to Write to properties file
public static String checkLastSuccessfulDateAsString(String filepath, String propName) {

    Properties prop = new Properties();
    InputStream input = null;

    try {

        input = new FileInputStream(filepath);

        // load a properties file
        prop.load(input);

        String lastSuccesfulDate = prop.getProperty(propName);

        log.info("Last Successful Date: "+lastSuccesfulDate);
        return lastSuccesfulDate;

    } catch (FileNotFoundException f) {
        log.error("checkLastSuccessfulDateAsString: File Not Found: " + f.getMessage());

    } catch (IOException ex) {
        log.error(ex.getMessage());
        ex.printStackTrace();
    } finally {
        if (input != null) {
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return null;

}

Привет

1 Ответ

0 голосов
/ 23 июня 2018

По умолчанию пружина @Scheduled использует одну нить. Таким образом, если одна задача блокировалась, следующая задача не запустится.

Вы можете сделать так, чтобы ваш класс задач реализовывал SchedulingConfigurer.It будет использовать многопоточность для запуска задачи и избежания блокировки. Код нравится:

@Component
public class TaskService implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod = "shutdown")
    public ScheduledExecutorService taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }

    // your code
    @Scheduled(initialDelayString = "${ingest.initialdelay.in.seconds}000", fixedRateString = "${ingest.rate.in.seconds}000")
    public void ingestData(){
       // Ingestion Logic
    }
}

Может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...