EJB 3.0 TimerService - запускать таймер 1-го числа каждого месяца - PullRequest
3 голосов
/ 28 декабря 2011

В EJB 3.0 TimerService.createTimer(initialDuration, intervalDuration, TimerID) метод принимает только аргументы initialDuration и intervalDuration.

Проблема в том, что я хочу запускать таймер 1-го числа каждого месяца и не могу установить таймер с помощью cronвыражение, как в EJB 3.1 TimerService.
Некоторые обходные пути, такие как запуск на ежедневной основе и проверка даты в методе @Timeout, если это «1-е число месяца», но это не подходящий способ.

IПрошел много примеров / уроков онлайн, но не повезло.Есть ли другой способ реализовать этот сценарий?

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Я предлагаю следующие подходы:

  • В методе @Timeout используйте JodaTime для вычисления следующего момента времени.Таким образом, каждый таймер планирует следующий вызов в своем методе @Timeout.Преимущество этого заключается в том, что вы можете создать диалоговое окно администратора, которое предоставляет обзор запланированных таймеров в системе, чего нельзя сделать, если вы просто запускаете таймер ежедневно.Я использовал это, чтобы реализовать довольно сложную, настраиваемую пользователем конфигурацию таймера (стиль Outlook, то есть что-то вроде «запускать это каждые два месяца в третий в 9:00). Даже с JodaTime я закончил тем, что написал много кода,Хотя, однако, в вашем случае это не должно быть так сложно. В основном, как

timerService.createTimer( new DateTime( System.currentTimeMillis()).plusMonths(1).withTimeAtStartOfDay().toDate(), null );

  • Отказаться от TimerService и использовать Quartz непосредственно для планирования. Затем вы можете передавать выражения cron непосредственно в API. Обычно Quartz прекрасно интегрируется с Java EE даже в сложных кластерных средах.
2 голосов
/ 28 декабря 2011
    try {
        Scheduler scheduler;
        scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();

        JobDetail job = new JobDetail("job name", "job group", (your class which will implement job interface).class);
        CronTrigger trigger = new CronTrigger("trigger name", "trigger group", "0 0 0 1 * ?");
        scheduler.scheduleJob(job, trigger);
    } catch (Exception e) {
        e.printStackTrace();
    }

Используйте приведенный выше код, таймер запускается 1-го числа каждого месяца.

...