См. @Schedule
API EJB 3.1. API, который мы выбрали для спецификации, немного ближе к синтаксису Quartz, чем cron — разница между ними небольшая.
Вот пример аннотации:
package org.superbiz.corn;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Schedule;
import javax.ejb.Schedules;
import javax.ejb.Singleton;
import java.util.concurrent.atomic.AtomicInteger;
/**
* This is where we schedule all of Farmer Brown's corn jobs
*/
@Singleton
@Lock(LockType.READ) // allows timers to execute in parallel
public class FarmerBrown {
private final AtomicInteger checks = new AtomicInteger();
@Schedules({
@Schedule(month = "5", dayOfMonth = "20-Last", minute = "0", hour = "8"),
@Schedule(month = "6", dayOfMonth = "1-10", minute = "0", hour = "8")
})
private void plantTheCorn() {
// Dig out the planter!!!
}
@Schedules({
@Schedule(month = "9", dayOfMonth = "20-Last", minute = "0", hour = "8"),
@Schedule(month = "10", dayOfMonth = "1-10", minute = "0", hour = "8")
})
private void harvestTheCorn() {
// Dig out the combine!!!
}
@Schedule(second = "*", minute = "*", hour = "*")
private void checkOnTheDaughters() {
checks.incrementAndGet();
}
public int getChecks() {
return checks.get();
}
}
Полный исходный код здесь
Вы можете сделать то же самое программно с помощью класса ScheduleExpression, который является просто конструируемым версия приведенной выше аннотации. Вот как выглядел бы приведенный выше пример, если бы расписание было создано в коде:
package org.superbiz.corn;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.ScheduleExpression;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import java.util.concurrent.atomic.AtomicInteger;
/**
* This is where we schedule all of Farmer Brown's corn jobs
*
* @version $Revision$ $Date$
*/
@Singleton
@Lock(LockType.READ) // allows timers to execute in parallel
@Startup
public class FarmerBrown {
private final AtomicInteger checks = new AtomicInteger();
@Resource
private TimerService timerService;
@PostConstruct
private void construct() {
final TimerConfig plantTheCorn = new TimerConfig("plantTheCorn", false);
timerService.createCalendarTimer(new ScheduleExpression().month(5).dayOfMonth("20-Last").minute(0).hour(8), plantTheCorn);
timerService.createCalendarTimer(new ScheduleExpression().month(6).dayOfMonth("1-10").minute(0).hour(8), plantTheCorn);
final TimerConfig harvestTheCorn = new TimerConfig("harvestTheCorn", false);
timerService.createCalendarTimer(new ScheduleExpression().month(9).dayOfMonth("20-Last").minute(0).hour(8), harvestTheCorn);
timerService.createCalendarTimer(new ScheduleExpression().month(10).dayOfMonth("1-10").minute(0).hour(8), harvestTheCorn);
final TimerConfig checkOnTheDaughters = new TimerConfig("checkOnTheDaughters", false);
timerService.createCalendarTimer(new ScheduleExpression().second("*").minute("*").hour("*"), checkOnTheDaughters);
}
@Timeout
public void timeout(Timer timer) {
if ("plantTheCorn".equals(timer.getInfo())) {
plantTheCorn();
} else if ("harvestTheCorn".equals(timer.getInfo())) {
harvestTheCorn();
} else if ("checkOnTheDaughters".equals(timer.getInfo())) {
checkOnTheDaughters();
}
}
private void plantTheCorn() {
// Dig out the planter!!!
}
private void harvestTheCorn() {
// Dig out the combine!!!
}
private void checkOnTheDaughters() {
checks.incrementAndGet();
}
public int getChecks() {
return checks.get();
}
}
Источник для этого примера находится здесь
Примечание: оба примера можно запускать в простой среде IDE и иметь тестовые сценарии, в которых используется Embeddable EJBContainer API также появился в EJB 3.1.
@Schedule против ScheduleExpression
- @Schedule
- Statically configured
- Возможны многие методы расписания
- Невозможно передать аргументы
- Не может быть отменен
Все вышеперечисленное выполняется в дескрипторе развертывания и поэтому ограничено только тем, что можно настроить заранее. Более динамичная версия использует следующую подпись TimerService:
TimerService .createCalendarTimer(javax.ejb.ScheduleExpression, javax.ejb.TimerConfig)
- ScheduleExpression
- Dynamically created
- Ровно один @Timeout поддерживает все ScheduleExpression
- Метод тайм-аута должен принимать
javax.ejb.Timer
в качестве параметра.
- Arguments can be passed
- Может быть отменен вызывающим абонентом или методом @Timeout.
Также обратите внимание, что существует аннотация перехватчика @AroundTimeout
, которая работает идентично @AroundInvoke
и позволяет перехватчикам участвовать в функциях таймера компонента.
person
David Blevins
schedule
09.09.2011