Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Создание пакетных артефактов

После определения задания в терминах его пакетных артефактов с помощью языка спецификации заданий (JSL) эти артефакты создаются как классы Java, реализующие интерфейсы пакета javax.batch.api и его подпакетов.

В этом разделе перечислены основные интерфейсы артефактов пакета, показано, как получить доступ к объектам контекста из пакетной среды выполнения, и приведены некоторые примеры.

Здесь рассматриваются следующие темы:

Интерфейсы пакетных артефактов

В следующих таблицах перечислены интерфейсы, которые реализуются при создании пакетных артефактов. Реализации интерфейса ссылаются на элементы, описанные в Использование языка спецификации задания.

Таблица 58-3 перечисляет интерфейсы для реализации пакетных артефактов для шагов фрагментов, шагов задачи и элементов принятия решения.

Таблица 58-4 перечисляет интерфейсы для реализации пакетных артефактов для разделённых шагов.

Таблица 58-5 перечисляет интерфейсы реализации пакетных артефактов для слушателей задания и шага.

Таблица 58-3 Основные интерфейсы пакетных артефактов

Пакет

Интерфейс

Описание

javax.batch.api

Batchlet

Реализует бизнес-логику шага задачи. На него ссылается элемент batchlet.

javax.batch.api

Decider

Принимает решение о следующем шаге, потоке (flow) или разделителе для выполнения на основе информации от предыдущего шага, потока (flow) или разделителя. На него ссылается элемент decision.

javax.batch.api.chunk

CheckPointAlgorithm

Реализует настраиваемую политику контрольных точек для шагов фрагментов. На него ссылается элемент checkpoint-algorithm внутри элемента chunk.

javax.batch.api.chunk

ItemReader

Читает элементы из входного источника в шаге фрагмента. На него ссылается элемент reader внутри элемента chunk.

javax.batch.api.chunk

ItemProcessor

Обрабатывает входные элементы для получения выходных элементов в шагах фрагмента. На него ссылается элемент processor внутри элемента chunk.

javax.batch.api.chunk

ItemWriter

Записывает выходные элементы в шагах фрагментов. На него ссылается элемент writer внутри элемента chunk.

Таблица 58-4. Интерфейсы пакетных артефактов разделения

Пакет

Интерфейс

Описание

javax.batch.api.partition

PartitionPlan

Сведения о выполнении разделённого шага, такие как количество разделений, количество потоков (flow) и параметры для каждого разделения. На этот артефакт нет прямой ссылки из файла определения задания.

javax.batch.api.partition

PartitionMapper

Предоставляет объект PartitionPlan. На него ссылается элемент mapper внутри элемента partition.

javax.batch.api.partition

PartitionReducer

Получает контроль, когда разделённый шаг начинается, заканчивается или откатывается. На него ссылается элемент reducer внутри элемента partition.

javax.batch.api.partition

PartitionCollector

Посылает промежуточные результаты из каждого разделения в анализатор разделений. На него ссылается элемент collector внутри элемента partition.

javax.batch.api.partition

PartitionAnalyzer

Обрабатывает данные и окончательные результаты из каждого разделения. На него ссылается элемент analyzer внутри элемента partition.

Таблица 58-5. Интерфейсы пакетных артефактов слушателя

Пакет

Интерфейс

Описание

javax.batch.api.listener

JobListener

Перехватывает выполнение задания до и после запуска задания. На него ссылается элемент listener внутри элемента job.

javax.batch.api.listener

StepListener

Перехватывает выполнение шага до и после выполнения шага. На него ссылается элемент listener внутри элемента step

javax.batch.api.chunk.listener

ChunkListener

Перехватывает обработку фрагмента в шагах фрагмента до и после обработки каждого фрагмента, а также при ошибках. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

ItemReadListener

Перехватывает чтение элементов в шагах фрагментов до и после чтения каждого элемента и при ошибках. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

ItemProcessListener

Перехватывает обработку элементов в шагах фрагментов до и после обработки каждого элемента и при ошибках. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

ItemWriteListener

Перехватывает запись элементов в шагах фрагментов до и после записи каждого элемента и при ошибках. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

RetryReadListener

Перехватывает повторное считывание элемента при возникновении исключения. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

RetryProcessListener

Перехватывает повторную обработку элементов в шагах фрагментов при возникновении исключений. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

RetryWriteListener

Перехватывает повторную запись элементов в шагах фрагментов при возникновении исключения. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

SkipReadListener

Перехватывает пропущенную обработку исключений при чтении элементов в шагах фрагментов. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

SkipProcessListener

Перехватывает пропущенную обработку исключений при обработке элементов в шагах фрагментов. На него ссылается элемент listener внутри элемента step.

javax.batch.api.chunk.listener

SkipWriteListener

Перехватывает пропущенную обработку исключений при записи элементов в шагах фрагментов. На него ссылается элемент listener внутри элемента step.

Инъецирование зависимостей в пакетных артефактах

Чтобы убедиться, что контексты и инъецирование зависимостей (CDI) работает в ваших пакетных артефактах, выполните следующие действия.

  1. Определите свои реализации пакетного артефакта как именованные компоненты CDI, используя аннотацию @Named.

    Например, определите реализацию читателя элементов в шаге фрагмента следующим образом:

    @Named("MyItemReaderImpl")
    public class MyItemReaderImpl implements ItemReader {
        /* ... Переопределить методы интерфейса ItemReader ... */
    }
  2. Предоставьте публичный пустой конструктор без аргументов для ваших пакетных артефактов.

    Например, предоставьте следующий конструктор для артефакта выше:

    public MyItemReaderImpl() {}
  3. Укажите имя CDI для пакетных артефактов в файле определения задания вместо использования полного имени класса.

    Например, определите шаг для артефакта выше следующим образом:

    <step id="stepA" next="stepB">
      <chunk>
        <reader ref="MyItemReaderImpl"></reader>
        ...
      </chunk>
    </step>

    В этом примере используется имя CDI (MyItemReaderImpl) вместо полностью определённого имени класса (com.example.pkg.MyItemReaderImpl) для указания пакетного артефакта.

  4. Убедитесь, что модуль является архивом бина CDI, пометив пакетные артефакты аннотацией javax.enterprise.context.Dependent или включив пустой дескриптор развёртывания beans.xml в приложение. Например, следующий пакетный артефакт помечен @Dependent:

    @Dependent
    @Named("MyItemReaderImpl")
    public class MyItemReaderImpl implements ItemReader { ... }

Примечание:

Для доступа к объектам контекста из пакетной среды выполнения в пакетных артефактах необходима поддержка контекстов и инъецирования зависимостей (CDI).

Если не выполнить эту процедуру, можно столкнуться со следующими ошибками.

  • Пакетная среда выполнения не сможет найти некоторые пакетные артефакты.

  • Пакетные артефакты сгенерируют исключения NullPointerException при доступе к инъецированным объектам.

Использование объектов контекста из пакетной среды выполнения

Пакетная среда выполнения предоставляет объекты контекста, которые реализуют интерфейсы JobContext и StepContext из пакета javax.batch.runtime.context. Эти объекты связаны с текущим заданием и шагом соответственно, и позволяют выполнять следующие действия:

  • Получение информации от текущего задания или шага, например его имя, идентификатор объекта, идентификатор выполнения, статус пакета и статус завершения

  • Установка пользовательского статуса завершения

  • Сохранение данных пользователя

  • Получение значений свойств из определения задания или шага

Вы можете инъецировать объекты контекста из пакетной среды выполнения при реализации пакетного артефакта, такие как читатели, обработчики, писатели элементов, слушатели и т. д. В следующем примере показано, как получить доступ к значениям свойств из файла определения задания в реализации читателя элементов:

@Dependent
@Named("MyItemReaderImpl")
public class MyItemReaderImpl implements ItemReader {
    @Inject
    JobContext jobCtx;

    public MyItemReaderImpl() {}

    @Override
    public void open(Serializable checkpoint) throws Exception {
        String fileName = jobCtx.getProperties()
                                .getProperty("log_file_name");
        ...
    }
    ...
}

Смотрите Инъецирование зависимостей в пакетных артефактах для получения инструкций о том, как определить пакетные артефакты для использования инъецирования зависимостей.

Замечание:

Не обращайтесь к объектам пакетного контекста внутри конструкторов артефактов.

Поскольку задание не запускается до тех пор, пока оно не отправлено на выполнение, объекты контекста пакета не будут доступны, когда CDI инстанцирует объекты артефактов при загрузке приложения. Инстанцирование этих бинов завершится неудачно, и пакетная среда выполнения не сможет найти пакетные артефакты, когда приложение отправит задание.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)