2017-02-15 34 views
1

Я использую EJB 3.1 и JBoss-EAP-6.4, и я хочу установить некоторые динамические параметры часа, минуту и ​​секунду EJB планировщика следующим образом:Параметрирования EJB планировщика с Schedule Expression

непараметрического кода - которые работают в 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 
    } 
} 

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

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

Dynamic parameters for @Schedule method in an EJB 3.x

Using the Timer Service - The Java EE 6 Tutorial

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

+0

Вы можете отладить и проверить объект «Таймер» возвращенное «createCalendarTimer», она содержит ScheduleExpression и сравнить является ли это создано в соответствии с требованиями или нет. Кроме того, проверьте, не активны ли другие таймеры. –

+0

Уважаемый @Nayan Wadekar, повторный запуск разрешен ответом, однако возникает новая проблема: планировщик не запускается при запуске –

+1

Не думайте, что с данным кодом возникает проблема. Вы пытались отлаживать, правильно ли выражение, метод тайм-аута вызывается правильно, postconstruct и т. Д. –

ответ

1

Вместо использования программного планирования, вот exmaple:

@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' - undefined parameter, 3, где следует определить «SECOND», «MINUTE» и «HOUR»? , 4- ваше решение не является полно параметрическим, потому что вы устанавливаете число (30) для аннотации AccessTimeout; Есть ли какой-либо полный параметрический подход? –

+1

entityUpdater вызывается на основе выражений cron выражений, выражений 30, является только timeOut (когда происходит большая транзакция), так что foget о комментарии (я удалил его btw). PropertiesLoader - это мой собственный класс (я загружаю эти свойства из файла свойств, MINUTE, SECOND и DAY_OF_WEEK - это ключи свойств btw). Вы можете настроить свои параметры теми, которые у вас есть (я предполагаю, что вы получаете эти параметры из БД). – javadev

+0

Вы правы, однако есть проблема: аннотация @Startup не выполняется вообще. Я имею в виду, что планировщик не звонит в начале. Кроме того, у меня есть еще один запрос: если это возможно (я очень ценю), пересмотреть свой ответ (особенно код), чтобы быть полезным вообще для других пользователей (я имею в виду, что не зависит от вашего класса). –