Пакетная обработка с потоком данных Spring Cloud

1. Обзор

В ссылке:/spring-cloud-data-flow-stream-processing[первая]статья серии мы представили архитектурный компонент Spring Cloud Data Flow и его использование для создания конвейера потоковых данных.

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

** 2. Локальный сервер потока данных и оболочка

**

Local Data Flow Server - это компонент, который отвечает за развертывание приложений, а Data Flow Shell позволяет нам

В ссылке:/spring-cloud-data-flow-stream-processing[предыдущая статья]мы использовали Spring Initilizr , чтобы настроить их как Spring Boot Application.

После добавления аннотации @ EnableDataFlowServer в основной класс server’s и аннотации @ EnableDataFlowShell в основной класс оболочки, соответственно, они готовы к запуску, выполнив

mvn spring-boot:run

Сервер загрузится через порт 9393, и оболочка будет готова взаимодействовать с ним из командной строки.

Вы можете обратиться к предыдущей статье за ​​подробной информацией о том, как получить и использовать Local Data Flow Server и его клиент оболочки.

3. Пакетное приложение

Как и в случае с сервером и оболочкой, мы можем использовать Spring Initilizr для настройки пакетного приложения root Spring Boot .

Добравшись до веб-сайта, просто выберите Group , имя Artifact и выберите Cloud Task в окне поиска зависимостей.

После этого нажмите кнопку Generate Project , чтобы начать загрузку артефакта Maven.

Артефакт поставляется с предварительно настроенным кодом и базовым кодом. Давайте посмотрим, как его отредактировать для создания нашего пакетного приложения.

3.1. Зависимости Maven

Прежде всего, давайте добавим пару зависимостей Maven. Поскольку это пакетное приложение, нам нужно импортировать библиотеки из Spring Batch Project :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

Также, поскольку Spring Cloud Task использует реляционную базу данных для хранения результатов выполненной задачи, нам нужно добавить зависимость в драйвер RDBMS: ``

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

Мы решили использовать базу данных H2 в памяти, предоставленную Spring. Это дает нам простой метод начальной загрузки. Однако в производственной среде вы захотите настроить свой собственный DataSource .

Помните, что версии артефактов будут унаследованы от родительского файла Spring Boot pom.xml .

3.2. Основной класс

Ключевым моментом для включения желаемой функциональности будет добавление аннотаций @ EnableTask и @ EnableBatchProcessing в основной класс Spring Boot’s . Эта аннотация на уровне класса сообщает Spring Cloud Task, чтобы она загрузила все:

@EnableTask
@EnableBatchProcessing
@SpringBootApplication
public class BatchJobApplication {

    public static void main(String[]args) {
        SpringApplication.run(BatchJobApplication.class, args);
    }
}

3.3. Конфигурация работы

Наконец, давайте настроим задание - в данном случае простую печать String в файл журнала:

@Configuration
public class JobConfiguration {

    private static Log logger
      = LogFactory.getLog(JobConfiguration.class);

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
          .start(stepBuilderFactory.get("jobStep1")
          .tasklet(new Tasklet() {

              @Override
              public RepeatStatus execute(StepContribution contribution,
                ChunkContext chunkContext) throws Exception {

                logger.info("Job was run");
                return RepeatStatus.FINISHED;
              }
        }).build()).build();
    }
}

Для получения дополнительной информации, вы можете увидеть нашу ссылку:/Введение в Spring Batch[Введение в Spring Batch].

Наконец-то наше приложение готово. Давайте установим его в нашем локальном репозитории Maven. Чтобы сделать это cd в корневой каталог проекта и введите команду:

mvn clean install

Теперь пришло время поместить приложение в Data Flow Server.

4. Регистрация приложения

Чтобы зарегистрировать приложение в Реестре приложений, нам необходимо предоставить уникальное имя, тип приложения и URI, которые можно разрешить в артефакте приложения.

Перейдите в Spring Cloud Data Flow Shell и введите команду из приглашения:

app register --name batch-job --type task
  --uri maven://org.baeldung.spring.cloud:batch-job:jar:0.0.1-SNAPSHOT

5. Создание задачи

Определение задачи может быть создано с помощью команды:

task create myjob --definition batch-job

Это создает новую задачу с именем myjob , указывающей на ранее зарегистрированное приложение пакетного задания.

Список текущих определений задач можно получить с помощью команды:

task list

6. Запуск задачи

Для запуска задачи мы можем использовать команду:

task launch myjob

После запуска задачи ее состояние сохраняется в реляционной БД. Мы можем проверить состояние выполнения наших задач с помощью команды:

task execution list

7. Просмотр результата

В этом примере задание просто печатает строку в файле журнала. Файлы журналов находятся в каталоге, отображаемом в выходных данных журнала Data Flow Server .

Чтобы увидеть результат, мы можем записать журнал:

tail -f PATH__TO__LOG\spring-cloud-dataflow-2385233467298102321\myjob-1472827120414\myjob[...]---[main]o.s.batch.core.job.SimpleStepHandler: Executing step:[jobStep1][...]---[main]o.b.spring.cloud.JobConfiguration: Job was run[...]---[main]o.s.b.c.l.support.SimpleJobLauncher:
  Job:[SimpleJob:[name=job]]completed with the following parameters:
   [{}]and the following status:[COMPLETED]----

[[Conclusion]]

===  **  8. Заключение**

В этой статье мы показали, как работать с пакетной обработкой с помощью __Spring Cloud Data Flow__.

Пример кода можно найти в https://github.com/eugenp/tutorials/tree/master/spring-cloud-data-flow[GitHub проекте]