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@SingletonpublicclassMyEJB {@Schedule(hour ="23", minute ="59", second ="59")publicvoidmyJob() {BatchRuntime.getJobOperator().start("myJob",newProperties());}}Конечно, вы можете изменить параметры
@Scheduleчтобы запустить пакетное задание в нужное время. -   Используйте 
ManagedScheduledExecutorServiceиспользуяjavax.enterprise.concurrent.Triggerкак показано ниже:0102030405060708091011121314151617181920212223242526@StatelesspublicclassMyStatelessEJB {@ResourceManagedScheduledExecutorService executor;publicvoidrunJob() {executor.schedule(newMyJob(),newTrigger() {publicDate getNextRunTime(LastExecution lastExecutionInfo, Date taskScheduledTime) {Calendar cal = Calendar.getInstance();cal.setTime(taskScheduledTime);cal.add(Calendar.DATE,1);returncal.getTime();}publicbooleanskipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) {returnnull== lastExecutionInfo;}});}publicvoidcancelJob() {executor.shutdown();}}Вызовите
runJobчтобы инициировать выполнение задания, иcancelJobчтобы прекратить выполнение задания. В этом случае новое задание запускается на день позже, чем предыдущее задание. И это не началось, пока предыдущий не закончен. Вам нужно больше проверок на ошибки для правильного выполнения.MyJob очень тривиально:
1234567publicclassMyJobimplementsRunnable {publicvoidrun() {BatchRuntime.getJobOperator().start("myJob",newProperties());}}Конечно, вы можете автоматически запланировать это, вызвав этот код в
@PostConstruct. -   Небольшое изменение второго метода позволяет запустить задание после фиксированной задержки, как показано:
123
publicvoidrunJob2() {executor.scheduleWithFixedDelay(newMyJob(),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… блог. |