Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Работа с шедулером в Java

Anna | 4.06.2014 | нет комментариев
Недавно в процессе работы, я столкнулся с задачей управления шедулерами, в работающем приложении. У нас серверное приложение, и в конфигурационных файлах Spring мы указывали, какие задачи запускать по таймеру. Впрочем, дальше возникла дальнейшая задача — убирать из списка выполнения эти задачи, либо же меня cron-таймер. При этом не тормозя приложение.
В процессе гугления, чтения, я обнаружил как это сделать. Всё оказалось значительно проще, чем я думал. Но чтоб осознать — пришлось немножко почитать.
Возможно эта статья будет пригодна новичкам, но допустимо и мастодонты почерпнут для себя что-то новое.

Используемые термины:

Шедулер — управляет таймерами запуска задач

Джоб — определенная задача, запускаемая по таймеру

Триггер — условие выполнения задачи — задает временные рамки запуска задач и их выполнения

Соответственно шедулер содержит в себе изложения всех задачи и триггеров к ним.

В системе применяется шедулер, тот, что описан в конфигурационном файле системы (shedulers.xml).

<beans:bean>
    <beans:property name="jobDetails">
        <beans:list>
            <beans:ref bean="reportCheckServiceJob" />
            <beans:ref bean="vacationApprovalAutoProcessServiceJob" />
            <beans:ref bean="plannedVacationServiceJob" />
            <beans:ref bean="employeeLdapServiceJob" />
            <beans:ref bean="oqProjectSyncServiceJob" />
        </beans:list>
    </beans:property>
    <beans:property name="triggers">
        <beans:list>
            <beans:ref bean="reportCheckServiceCronTrigger" />
            <beans:ref bean="vacationApprovalAutoProcessServiceCronTrigger" />
            <beans:ref bean="plannedVacationServiceCronTrigger" />
            <beans:ref bean="employeeLdapServiceCronTrigger" />
            <beans:ref bean="oqProjectSyncServiceCronTrigger" />
        </beans:list>
    </beans:property>
</beans:bean>

Пример джоб (и обслуживания, способ которого он вызывает):

<beans:bean id="plannedVacationService"
            />

<beans:bean id="plannedVacationServiceJob"
           >
    <beans:property name="targetObject" ref="plannedVacationService" />
    <beans:property name="targetMethod" value="service" />
</beans:bean>

Где targetObject указывает класс-сервис (бин), в котором содержится способ, тот, что нужно запускать по таймеру. В targetMethod — указываем наименование способа.

Пример триггера:

<beans:bean id="plannedVacationServiceCronTrigger"
           >
    <beans:property name="jobDetail" ref="plannedVacationServiceJob" />
    <beans:property name="cronExpression" value="${scheduler.plannedvacationcheck}" />
</beans:bean>

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

Сейчас о том, как руководить шедулером.

Для управления этим шедулером, нужно в контроллере (сервисе) подключить данный бин (в нашем случае это SchedulerFactoryBean).

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

Разглядим способы шедулера для остановки и запуска джобов:

pauseJob(String name, String Group) — остановить выполнение задачи шедулера в указанной группе джобов. Остановка происходит путём остановки соответствующего триггера (см. pauseTrigger)

resumeJob(String name, String Group) — возобновить выполнение задачи шедулера в указанной группе джобов. Поправление происходит путём запуска соответствующего триггера (см. resumeTrigger)

pauseTrigger(String name, String Group) — останавливает триггер в соответствующей группе

resumeTrigger(String name, String Group) — возобновляет работу триггера в соответсвующей группе

pauseAll — останавливает все задачи шедулера (pauseJobs(String group) — только у определенной группы)

resumeAll — возобновляет запуск всех задач шедулера (см. также resumeJobs)

А так же ниже в коде приводится код как дозволено посмотреть все задачи у группы джобов, и список всех имеющихся групп в шедулере. По умолчанию, если у джобов не указаны группы, то им присваивается группаDEFAULT.

Дозволено автоварить (@Autowired) напрямую триггеры и руководить их планировщиком cron. В примере это plannedVacationServiceCronTrigger, у которого мы меняем CronExpression. Либо же дозволено обратиться к триггеру через шедулер вызвав способ getTrigger(String name, String group).

    @Autowired
    @Qualifier("plannedVacationServiceCronTrigger")
    private CronTriggerBean plannedVacationServiceCronTrigger;

    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;

    public someMethod(){

        logger.info(plannedVacationServiceCronTrigger.getCronExpression());
        plannedVacationServiceCronTrigger.setCronExpression("*/1 * * * * ?");

        //schedulerFactoryBean.getScheduler().pauseJob("plannedVacationServiceJob", "DEFAULT");
        schedulerFactoryBean.getScheduler().pauseTrigger("plannedVacationServiceCronTrigger", "DEFAULT");

        for (String str : schedulerFactoryBean.getScheduler().getJobGroupNames()){
            logger.info(str);
        }

        for (String str : schedulerFactoryBean.getScheduler().getJobNames("DEFAULT")){
            logger.info(str);
        }

        logger.info(schedulerFactoryBean.getScheduler().getTrigger("plannedVacationServiceJob", "DEFAULT").getCronExpression());
    }

Что читать:
www.seostella.com/ru/article/2012/02/12/ispolzovanie-annotacii-autowired-v-spring-3.html
static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html
quartz-scheduler.org/api/2.1.0/org/quartz/Scheduler.html
ru.wikipedia.org/wiki/Cron

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB