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

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

Простой вариант использования

В этом разделе показано, как определить простое задание с использованием языка спецификации заданий (Job Specification Language — JSL) и как реализовать соответствующие пакетные артефакты. Обратитесь к остальным разделам этой главы для подробного описания элементов во фреймворке пакетной обработки.

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


<job id="simplejob" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                    version="1.0">
  <properties>
    <property name="input_file" value="input.txt"/>
    <property name="output_file" value="output.txt"/>
  </properties>
  <step id="mychunk" next="mytask">
    <chunk>
      <reader ref="MyReader"></reader>
      <processor ref="MyProcessor"></processor>
      <writer ref="MyWriter"></writer>
    </chunk>
  </step>
  <step id="mytask">
    <batchlet ref="MyBatchlet"></batchlet>
    <end on="COMPLETED"/>
  </step>
</job>

Шаг фрагмента

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

public class MyCheckpoint implements Serializable {
    private long lineNum = 0;
    public void increase() { lineNum++; }
    public long getLineNum() { return lineNum; }
}

Следующая реализация средства чтения элементов продолжает чтение входного файла с предоставленной контрольной точки, если задание было перезапущено. Элементами являются отдельные строки в текстовом файле (в более сложных сценариях элементы являются пользовательскими типами Java, а источником ввода может быть база данных):

@Dependent
@Named("MyReader")
public class MyReader implements javax.batch.api.chunk.ItemReader {
    private MyCheckpoint checkpoint;
    private BufferedReader breader;
    @Inject
    JobContext jobCtx;

    public MyReader() {}

    @Override
    public void open(Serializable ckpt) throws Exception {
        if (ckpt == null)
            checkpoint = new MyCheckpoint();
        else
            checkpoint = (MyCheckpoint) ckpt;
        String fileName = jobCtx.getProperties()
                                .getProperty("input_file");
        breader = new BufferedReader(new FileReader(fileName));
        for (long i = 0; i < checkpoint.getLineNum(); i++)
            breader.readLine();
    }

    @Override
    public void close() throws Exception {
        breader.close();
    }

    @Override
    public Object readItem() throws Exception {
        String line = breader.readLine();
        return line;
    }
}

В следующем случае обработчик элементов приводит строку к верхнему регистру. Более сложные примеры могут обрабатывать элементы различными способами или преобразовывать их в пользовательские выходные типы Java:

@Dependent
@Named("MyProcessor")
public class MyProcessor implements javax.batch.api.chunk.ItemProcessor {
    public MyProcessor() {}

    @Override
    public Object processItem(Object obj) throws Exception {
        String line = (String) obj;
        return line.toUpperCase();
    }
}

Примечание:

API пакетной обработки не поддерживает обобщённые типы (generic). В большинстве случаев нужно привести объекты к конкретному типу перед обработкой.

Средство записи элементов записывает обработанные элементы в выходной файл. Оно перезаписывает выходной файл, если контрольная точка не указана. В противном случае возобновляет запись в конец файла. Элементы записываются фрагментами:

@Dependent
@Named("MyWriter")
public class MyWriter implements javax.batch.api.chunk.ItemWriter {
    private BufferedWriter bwriter;
    @Inject
    private JobContext jobCtx;

    @Override
    public void open(Serializable ckpt) throws Exception {
        String fileName = jobCtx.getProperties()
                                .getProperty("output_file");
        bwriter = new BufferedWriter(new FileWriter(fileName,
                                                    (ckpt != null)));
    }

    @Override
    public void writeItems(List<Object> items) throws Exception {
        for (int i = 0; i < items.size(); i++) {
            String line = (String) items.get(i);
            bwriter.write(line);
            bwriter.newLine();
        }
    }

    @Override
    public Serializable checkpointInfo() throws Exception {
        return new MyCheckpoint();
}

Шаг задачи

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

@Dependent
@Named("MyBatchlet")
public class MyBatchlet implements javax.batch.api.chunk.Batchlet {
    @Inject
    private JobContext jobCtx;

    @Override
    public String process() throws Exception {
        String fileName = jobCtx.getProperties()
                                .getProperty("output_file");
        System.out.println(""+(new File(fileName)).length());
        return "COMPLETED";
    }
}

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