Параметризация планировщика EJB с помощью выражения расписания

1

Я использую EJB 3.1 и jboss-eap-6.4, и я хочу установить некоторые динамические параметры для часа, минуты и секунды планировщика ejb следующим образом:

Непараметрический код, который запускается через 30 секунд каждые 5 минут:

@Singleton
@Startup
public class TriggerJob {
    @EJB
   //some db injections           

    @PostConstruct
    public void onStartup() {
        try {
            preparation();
        } catch (CertificateVerificationException e) {
            e.printStackTrace();
        }
    }

    @Schedule(second = "30", minute = "*/5", hour = "*", persistent = false)
    public void preparation() {
    //my scheduled tasks
    }
}

Приведенный выше код выполняется правильно.

Динамический параметрический код - который должен запускаться в течение 30 секунд каждые 5 минут:

@Singleton
@Startup
public class TriggerJob {

    @EJB
    //some injections

    private boolean runningFlag = false;

    @Resource
    private TimerService timerService;

    public void setTimerService(TimerService timerService) {
        this.timerService = timerService;
    }

    @Timeout
    public void timerTimeout() {
        try {
            preparation();
        } catch (CertificateVerificationException e) {
            e.printStackTrace();
        }
    }

    @PostConstruct
    private void postCunstruct() {
        timerService.createCalendarTimer(createSchedule(),new TimerConfig("EJB timer service timeout at ",false));
    }

    private ScheduleExpression createSchedule() {
        ScheduleExpression expression = new ScheduleExpression();
        expression.hour("*")
                .minute("*/5")
                .second("30");
        return expression;
    }

    public void preparation(){
    // my scheduled tasks
    }
}

Приведенный выше код не выполняется правильно, обычно он выполняется несколько раз в секунду.

Кроме того, я прочитал несколько других вопросов, которые мне не помогли:

Динамические параметры для метода @Schedule в EJB 3.x

Использование службы Timer - Учебник Java EE 6

Любая помощь будет оценена.

  • 0
    Можете ли вы отладить и проверить объект 'Timer', возвращенный функцией 'createCalendarTimer', он содержит ScheduleExpression и сравнить, создан ли он как требуется или нет. Дополнительно проверьте, не активны ли другие таймеры.
  • 0
    Уважаемый @Nayan Wadekar, умножение прогона решается ответом, однако возникает новая проблема: планировщик не запускается при запуске
Показать ещё 1 комментарий
Теги:
ejb
scheduler
ejbscheduler

1 ответ

1
Лучший ответ

Вместо этого используйте программное планирование, вот пример:

@Singleton
@Startup
public class TriggerJob{

    @EJB
    //some injections

    @Resource
    private TimerService timerService;

    @PostConstruct
    public void init() {
        createTimer();
        //the following code resolve my startup problem
        try {
        preparation();
        } catch (CertificateVerificationException e) {
            e.printStackTrace();
        }
    }

    @Timeout
    public void timerTimeout() {
        try {
        preparation();
        } catch (CertificateVerificationException e) {
        e.printStackTrace();
        }
    }

    private void createTimer() {
        ScheduleExpression scheduleExpression = new ScheduleExpression();
        scheduleExpression.second("30").minute("*/5").hour("*");
        TimerConfig timerConfig = new TimerConfig();
        timerConfig.setPersistent(false);
        timerService.createCalendarTimer(scheduleExpression, timerConfig);
        }

    public void preparation(){
        // my scheduled tasks
    }
}
  • 0
    Спасибо Уважаемый @javadev, но в вашем коде есть некоторые недопонимания: 1- PropertiesLoader - неизвестный класс, 2- constructCronsMap - неопределенный параметр, 3 - где я должен определить SECOND , MINUTE и HOUR ? , 4 - ваше решение не является полностью параметрическим, потому что вы задали число (30) для аннотации AccessTimeout; Есть ли полный параметрический подход?
  • 1
    EntityUpdater вызывается в выражениях cron по выражению schedulerexression, 30 - это только timeOut (когда происходит большая транзакция), так что не обращайте внимания на комментарий (я удалил его, кстати). PropertiesLoader - это мой собственный класс (я загружаю эти свойства из файла свойств, кстати, MINUTE, SECOND и DAY_OF_WEEK являются ключами свойств). Вы можете настроить свои собственные параметры теми, которые у вас есть (я полагаю, вы получаете эти параметры из БД).
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню