Запретить выполнение cron, если он уже запущен - PullRequest
0 голосов
/ 19 мая 2018

У меня есть (или много) задача cron, и она выполняется каждые 5 секунд (это не имеет значения), и я хочу, чтобы она не выполнялась, если предыдущий запуск не завершен.Вот мой код: и если планировщик выполняется в первый раз в 12:00:00, я хочу, чтобы он выполнялся после 12:00:10 второй (третий ...) раз.Кто-нибудь может мне помочь?

public class Task {
    private Long id;
    private String cron;
    private Long millis; //the task runnig time(begin to end)

    //getter setter
}

public class TaskSchedulerTest {
    private Map<Long, ScheduledFuture> futureMap = new HashMap<>();

    public static void main(String[] args) {
        new TaskSchedulerTest().t();
    }

    private void t() {
        Task t1 = new Task(1L, "0/3 * * * * *", 10000L);
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.initialize();
        taskScheduler.setThreadNamePrefix("scheduler task");
        ScheduledFuture sf1 = taskScheduler.schedule(new RunnableTask(t1), new CronTrigger(t1.getCron()));
        futureMap.put(t1.getId(), sf1);
    }

    private class RunnableTask implements Runnable {
        private Task task;
        private int times;

        private RunnableTask() {
        }

        private void println(String string) {
            System.out.println(Thread.currentThread().getName() + string);
        }

        private RunnableTask(Task task) {
            this.task = task;
        }

        @Override
        public void run() {
            //check if previous is not finished, i checked it's isDone()
            //and it return false while the previous is running
            println(" begin: " + task.getId() + " times: " + times);
            ScheduledFuture future = futureMap.get(task.getId());
            println(" done: " + future.isDone());
            try {
                Thread.sleep(task.getMillis()); //or do something
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            println(" end: " + task.getId() + " times: " + times);
            times++;
        }
    }
}

Я использую новый cron "0/3 * * * * *" и заменяю sleep для чтения и записи файла, например:

FileInputStream fis = new FileInputStream("D:\\test\\test.exe");
FileOutputStream fos = new FileOutputStream("D:\\test\\a-" + times + "");
fos.write(IOUtils.toByteArray(fis));
fos.flush();
fos.close();
fis.close();

Иэто журнал:

начало задачи планировщика 1: 1 раз: 0 отметка времени: 05: 51

конец задачи планировщика 1: 1 раз: 0 отметка времени: 06: 10

начало задачи планировщика 1: 1 раз: 1 отметка времени: 06: 11

конец задачи планировщика 1: 1 раз: 1 отметка времени: 06: 17

начало задачи планировщика 2: 1 раз: 2 отметка времени:06: 18

конец задачи планировщика 2: 1 раз: 2 отметка времени: 06: 24

начало задачи планировщика 1: 1 раз: 3 отметка времени: 06: 25

конец задачи планировщика 1: 1 раз: 3 отметки времени: 06: 33

начало задачи планировщика 3: 1 раз: 4 отметки времени: 06: 34

конец задания планировщика 3: 1 раз: 4 отметки времени: 06: 40

Журнал означает, что моя проблема не проблема.

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