Статьи

Расписание Java EE 7 Batch Jobs

Java EE 7 добавила возможность выполнять пакетные задания стандартным способом с использованием JSR 352.

1
2
3
4
5
6
7
<job id="myJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
  <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 предлагает три различных способа планирования этих заданий:

  1. Используйте аннотацию @javax.ejb.Schedule в EJB. Вот пример кода, который будет запускать пакетное задание каждый день в 23:59:59.
    1
    2
    3
    4
    5
    6
    7
    @Singleton
    public class MyEJB {
      @Schedule(hour = "23", minute = "59", second = "59")
      public void myJob() {
        BatchRuntime.getJobOperator().start("myJob", new Properties());
      }
    }

    Конечно, вы можете изменить параметры @Schedule чтобы запустить пакетное задание в нужное время.

  2. Используйте ManagedScheduledExecutorService используя javax.enterprise.concurrent.Trigger как показано ниже:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    @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 очень тривиально:

    1
    2
    3
    4
    5
    6
    7
    public class MyJob implements Runnable {
     
        public void run() {
            BatchRuntime.getJobOperator().start("myJob", new Properties());
        }
     
    }

    Конечно, вы можете автоматически запланировать это, вызвав этот код в @PostConstruct .

  3. Небольшое изменение второго метода позволяет запустить задание после фиксированной задержки, как показано:
    1
    2
    3
    public void runJob2() {
        executor.scheduleWithFixedDelay(new MyJob(), 2, 3, TimeUnit.HOURS);
    }

    Первая задача выполняется через 2 часа после runJob2 метода runJob2 . И затем с задержкой в ​​3 часа между последующим исполнением.

Эта поддержка доступна вам на платформе Java EE. Кроме того, вы также можете вызвать BatchRuntime.getJobOperator().start("myJob", new Properties()); от любого из ваших запланированных Quartz методов.

Как вы планируете свои пакетные задания?

Ссылка: Расписание Java EE 7 Batch Jobs от нашего партнера JCG Аруна Гупты в Miles to go 2.0… блог.