Java EE 7 добавила возможность выполнять пакетные задания стандартным способом с использованием JSR 352.
1
2
3
4
5
6
7
|
< step id = "myStep" > < chunk item-count = "3" > < reader ref = "myItemReader" /> < processor ref = "myItemProcessor" /> < writer ref = "myItemWriter" /> </ chunk > |
Этот фрагмент кода является языком спецификации заданий, определенным как XML, или Job XML. Он определяет каноническую работу, с одним шагом, используя элементно-ориентированную или чанк-ориентированную обработку. Чанк может иметь считыватель, дополнительный процессор и записывающее устройство. Каждый из этих элементов идентифицируется с использованием соответствующих элементов в XML-задании и представляет собой компоненты CDI, упакованные в архив.
Эта работа может быть легко начата с помощью:
1
|
BatchRuntime.getJobOperator().start( "myJob" , new Properties()); |
Типичный вопрос, который задают на разных форумах и конференциях, — как запланировать эти задания во время выполнения Java EE. Сам API Batch 1.0 не предлагает ничего для планирования этих заданий. Однако платформа Java EE предлагает три различных способа планирования этих заданий:
- Используйте аннотацию
@javax.ejb.Schedule
в EJB. Вот пример кода, который будет запускать пакетное задание каждый день в 23:59:59.1234567@Singleton
public
class
MyEJB {
@Schedule
(hour =
"23"
, minute =
"59"
, second =
"59"
)
public
void
myJob() {
BatchRuntime.getJobOperator().start(
"myJob"
,
new
Properties());
}
}
Конечно, вы можете изменить параметры
@Schedule
чтобы запустить пакетное задание в нужное время. - Используйте
ManagedScheduledExecutorService
используяjavax.enterprise.concurrent.Trigger
как показано ниже:0102030405060708091011121314151617181920212223242526@Stateless
public
class
MyStatelessEJB {
@Resource
ManagedScheduledExecutorService executor;
public
void
runJob() {
executor.schedule(
new
MyJob(),
new
Trigger() {
public
Date getNextRunTime(LastExecution lastExecutionInfo, Date taskScheduledTime) {
Calendar cal = Calendar.getInstance();
cal.setTime(taskScheduledTime);
cal.add(Calendar.DATE,
1
);
return
cal.getTime();
}
public
boolean
skipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) {
return
null
== lastExecutionInfo;
}
});
}
public
void
cancelJob() {
executor.shutdown();
}
}
Вызовите
runJob
чтобы инициировать выполнение задания, иcancelJob
чтобы прекратить выполнение задания. В этом случае новое задание запускается на день позже, чем предыдущее задание. И это не началось, пока предыдущий не закончен. Вам нужно больше проверок на ошибки для правильного выполнения.MyJob очень тривиально:
1234567public
class
MyJob
implements
Runnable {
public
void
run() {
BatchRuntime.getJobOperator().start(
"myJob"
,
new
Properties());
}
}
Конечно, вы можете автоматически запланировать это, вызвав этот код в
@PostConstruct
. - Небольшое изменение второго метода позволяет запустить задание после фиксированной задержки, как показано:
123
public
void
runJob2() {
executor.scheduleWithFixedDelay(
new
MyJob(),
2
,
3
, TimeUnit.HOURS);
}
Первая задача выполняется через 2 часа после
runJob2
методаrunJob2
. И затем с задержкой в 3 часа между последующим исполнением.
Эта поддержка доступна вам на платформе Java EE. Кроме того, вы также можете вызвать BatchRuntime.getJobOperator().start("myJob", new Properties());
от любого из ваших запланированных Quartz методов.
- Вы можете попробовать все это на WildFly .
- А на сайте github.com/javaee-samples/javaee7-samples есть множество примеров Java EE 7.
- Этот конкретный образец доступен по адресу github.com/javaee-samples/javaee7-samples/tree/master/batch/scheduling .
Как вы планируете свои пакетные задания?
Ссылка: | Расписание Java EE 7 Batch Jobs от нашего партнера JCG Аруна Гупты в Miles to go 2.0… блог. |