LINUX.ORG.RU

Проектирование настраиваемых событий по расписанию

 , , , ,


0

1

Требуется иметь возможность динамически настраивать систему событий, которые должны вызываться (выполняться) по графику. Некое подобие крона.

Есть мысли, как это сделать, но не могу определиться, как будет лучше. Может быть, есть какие мануалы, или кто-то делал? Поделитесь, плз, инфой и мыслями.

Жить все планирует на Java 8, SpringBoot 2.

★★★★★

Последнее исправление: bvn13 (всего исправлений: 2)

Чем не устраивают?

java.util.Timer
java.util.TimerTask

Deleted
()
Ответ на: комментарий от Deleted

да, настройки динамические, хранятся в БД. КМК, должен быть главный таймер, который раз в 1 сек получает список событий к запуску и запускает их параллельно в тредах.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

как запускать менеджера заданий я себе представляю. а как хранить расписания, делать выборку заданий по расписанию - вот это нужно спроектировать

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

да я стебусь) предлагал тебе Akka затащить в проект)

Не нужно это тебе.

Расписание сделай по принципу кронтаба - перекрывает бОльшую часть всех возможных кейсов.

nihirash ★★★
()
Ответ на: комментарий от maxcom

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

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

можно поиграться с чем-нить таким. удаление тоже можно сделать. вообще с динамикой job-ов, как-то всё плохо.

@Bean
    public SchedulerFactoryBean schedulerFactoryBean(List<BaseJob> jobs) throws Exception {
        final Trigger[] triggers = new Trigger[jobs.size()];
        final SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
        for (int i=0; i < jobs.size(); i++) {
            final BaseJob job = jobs.get(i);
            logger.info("Register:\nJob: " + job.getBeanName() + ".\nDefault active: " + job.isActive() + ".\nCron: " + job.getCron());

            MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
            jobDetail.setTargetObject(job);
            jobDetail.setTargetMethod("executeJob");
            jobDetail.setName(job.getBeanName());
            jobDetail.setConcurrent(false);
            jobDetail.afterPropertiesSet();

            CronTriggerBean cronTriggerBean = new CronTriggerBean();
            cronTriggerBean.setCronExpression(job.getCron());
            cronTriggerBean.setStartDelay(startDelay);
            cronTriggerBean.setName(job.getBeanName() + "_trigger");
            cronTriggerBean.setJobDetail(jobDetail.getObject());
            cronTriggerBean.afterPropertiesSet();

            triggers[i] = cronTriggerBean;
        }
        scheduler.setTriggers(triggers);

        return scheduler;
    }

vtVitus ★★★★★
()
Ответ на: комментарий от bvn13

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

Добавлять можно. С удаление сложнее — механизм есть, но складывается ощущение что это у них он них сам собой получился и не поддерживается официально.

maxcom ★★★★★
()

или кто-то делал? Поделитесь, плз, инфой и мыслями.

для расписания юзай спринг https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springfr...

там есть крон-триггер, задача прибивается через future которую эта штука вернула

для управления задачами можешь копнуть пример построения отсюда: https://github.com/codeabovelab/haven-platform/blob/master/cluster-manager/sr...

это сервис управления задачами (постановкой на выполнения и т.п.)

вот пример запуска и удаления job расписанием https://github.com/codeabovelab/haven-platform/blob/master/cluster-manager/sr...

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.