Статьи

Создание календарных таймеров в Java EE 6

Java EE 6 позволяет разработчикам создавать таймеры приложений, которые инициализируются при развертывании на сервере приложений либо бина сеанса без состояния, бина Singleton или бина, управляемого сообщениями.

Чтобы указать, что метод на любом из этих компонентов должен вызываться по времени, этот метод должен быть аннотирован либо аннотацией @Schedule (для расписаний с одним таймером), либо аннотацией @Schedules (для расписаний с несколькими таймерами ).

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

package com.acme.timer;
 
import javax.ejb.Schedule;
import javax.ejb.Schedules;
import javax.ejb.Stateless;
import javax.ejb.Timer;
 
@Stateless
public class CalendarTimer {
 
  @SuppressWarnings("unused")
  @Schedule(second = "*/10", minute = "*", hour = "8-17", dayOfWeek = "Mon-Fri", dayOfMonth = "*", month = "*", year = "*", info = "Scheduled Timer")
  private void scheduledTimeout(final Timer t) {
    System.out.println(t.getInfo().toString() + " called at: "
        + new java.util.Date());
  }
 
  @SuppressWarnings("unused")
  @Schedules({
      @Schedule(second = "15", minute = "*", hour = "8-17", dayOfWeek = "Mon-Fri", dayOfMonth = "*", month = "*", year = "*", info = "2nd Scheduled Timer"),
      @Schedule(second = "45", minute = "*", hour = "8-17", dayOfWeek = "Mon-Fri", dayOfMonth = "*", month = "*", year = "*", info = "2nd Scheduled Timer") })
  private void scheduledTimeout2(final Timer t) {
    System.out.println(t.getInfo().toString() + " called at: "
        + new java.util.Date());
    System.out.println();
  }
}

Как можно видеть, первый таймер аннотируется
аннотацией
@Schedule . Эта аннотация принимает несколько параметров, которые определяют расписание таймера:

второй Количество секунд: от 0 до 59
минут Количество минут: от 0 до 59
час Количество часов: от 0 до 23
день недели День недели. Это может принимать текстовые значения ( вс , пн , вт , ср , чт , пт , сб ) или числовые значения от 0 до 70, и 7 указывают на воскресенье)
DayOfMonth День месяца Это может принимать текстовые значения ( 1 , 2 и т. Д.) Или числовые значения от 1 до 31 . Отрицательные значения также можно использовать для указания дней до конца месяца. Значение Last также можно использовать для указания последнего дня месяца.
месяц Месяц в году. Это может принимать текстовые значения ( январь , февраль , мар , апрель , май , июнь , июль , август , сентябрь , октябрь , ноябрь , декабрь ) или числовые значения от 1 до 12
год Год. Это может занять числовые годы в формате гггг .
Информация Дополнительная информация передается в функцию таймера.

В приведенной выше таблице показаны допустимые значения, которые можно использовать для каждого выражения, используемого для построения расписания. Эти значения также могут быть расширены в выражения для составления более сложных расписаний.

Подстановочный знак: подстановочный знак (*) используется для указания того, что расписание будет запускаться для каждого действительного значения определенного операнда. Например, установка значения
second = «0», minute = «*» приведет к тому, что таймер будет вызываться каждую минуту в 0 секунд.

Списки : разделенные запятыми списки значений позволяют таймерам появляться при каждом значении в списке, а не при всех допустимых значениях, как указано подстановочным знаком Например,
секунда = «0», минута = «0, 15, 30, 45» приведет к тому, что таймер будет вызываться каждые четверть часа.

Изменяется: Разделенные Hypen диапазоны позволяют таймерам находиться в пределах указанного диапазона. Например,
dayOfMonth = «1-5» приведет к тому, что таймер будет вызываться каждый день в течение первых 5 дней каждого месяца.

Интервалы : Интервалы определены в формате начало / интервал и действительны только для часов, минут и секунд. Интервал определяется как начальное значение для таймера, а затем интервал, с которым будет вызываться таймер. Например,
hour = «12/1» будет вызывать таймер на час, каждый час во второй половине дня. Можно комбинировать подстановочные и интервальные выражения, чтобы таймер вызывался каждые
x часов, минут или секунд. Например 
минута = «* / 10»будет вызывать таймер каждые 10 минут.

Второй метод в приведенном выше примере показывает, как 2 разных расписания могут быть применены к таймеру. В этом случае метод аннотируется
аннотацией
@Schedules, а не
аннотацией
@Schedule .

 

От http://www.davidsalter.com/2011/12/creating-calendar-based-timers-in-java.html