Deltaspike и Quartz: как установить cronExpressions из конфигурационного файла

Я думаю, название вполне самоочевидно. У меня есть работа:

import org.apache.deltaspike.scheduler.api.Scheduled;
import org.quartz.Job;

@Scheduled(cronExpression = "0 0/1 * * * ?")
public class JobA implements Job {
  //job code
}

закодирован для запуска каждую минуту. Я хотел бы установить это выражение cron извне, то есть файл конфигурации. Я использую Deltaspike, я не могу найти способ добиться этого. Я думал о классе JobDispatcher, может быть, откуда создать задание и установить для него выражение cron, но я не вижу подсказки в документации DeltaSpike.

Заранее спасибо!


person McCoy    schedule 20.03.2015    source источник


Ответы (2)


Сделайте выражение Cron частной финальной статической константой, получая свое значение из файла конфигурации, и используйте его в аннотации.

person Rami Del Toro    schedule 20.03.2015
comment
Спасибо за ответ! аннотация принимает константы, как вы указали, но константа не может быть изменена во время выполнения (только грубо обработана), поэтому (насколько мне известно) невозможно получить значение из файла и установить его в константу. - person McCoy; 25.03.2015
comment
Пожалуйста. Не уверен, как вы загружаете файл свойств. Подход, который я использовал, заключается в загрузке файла свойств в перечисление (с одним экземпляром - singleton) и просто установке статической конечной строки. пример: private static final String name = PropertiesLoader.INSTANCE.getProperty(NAME); - person Rami Del Toro; 26.03.2015
comment
Спасибо @Рами! Однажды я использовал подобный способ, когда имел дело с Dropwizard. Но теперь у Deltaspike есть собственный способ загрузки файла свойств. Что-то вроде этого: @Inject @ConfigProperty(name = yourProperty) String attHoldingTheValue; во время выполнения. В любом случае, я попробую то, что вы здесь предлагаете, возможно, используя отдельный файл свойств. Я буду обновлять этот пост, если найду другой способ. Большое спасибо! - person McCoy; 26.03.2015

Что ж, в итоге я использовал Quartz как есть, через JobDispatch.java, который настраивает планировщик, и, как указано в спецификациях Quartz, используя все библиотеки из Quartz вместо модуля планировщика Deltaspike. Пока все хорошо, я думал, что полностью независим от deltaspike-scheduler-module-api-1.2.1 и deltaspike-scheduler-module-impl-1.2.1, но дело в том, что это не так. Как только все заработало правильно, я решил немного почистить и избавиться от этих двух библиотек. Тогда я понял, что они у меня были в моем пути сборки, поэтому я сначала удалил их оттуда и, наконец, удалил их с диска. К моему удивлению, когда я снова попытался запустить свое приложение, возникли некоторые исключения, на самом деле NullPointerExceptions, исходящие из переменных @Inject. Я не исследовал это глубже, но я позволил этим библиотекам жить в пути сборки, поскольку он работал именно так.

Я думаю, что эти библиотеки каким-то образом поддерживают CDI через задания, независимо от того, взяты ли все материалы cronjobs только из библиотек Quartz.

Если кто-то может пролить свет здесь, добро пожаловать.

Спасибо!

ОБНОВЛЕНИЕ 4/2016

Deltaspike 1.6 теперь поддерживает такие функции: Настраиваемые выражения CRON

ОБНОВЛЕНИЕ 2 — 4 апреля 2016 г.

Для выражения Quartz cron настройка не так проста, см. Конфигурация во время запуска контейнера для получения дополнительной информации.

person McCoy    schedule 28.04.2015