Перейти к основному содержимому

Пакетная обработка с помощью Spring Cloud Data Flow

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

В первой статье серии мы представили архитектурный компонент Spring Cloud Data Flow и то, как его использовать для создания конвейера потоковых данных.

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

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

Локальный сервер потока данных — это компонент, который отвечает за развертывание приложений, а оболочка потока данных позволяет нам выполнять команды DSL, необходимые для взаимодействия с сервером.

В предыдущей статье мы использовали Spring Initilizr , чтобы настроить их обоих как приложение Spring Boot.

После добавления аннотации @EnableDataFlowServer к основному классу сервера и аннотации @EnableDataFlowShell к основному классу оболочки соответственно, они готовы к запуску, выполнив: ``

mvn spring-boot:run

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

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

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

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

После перехода на веб-сайт просто выберите группу , имя артефакта и выберите « Облачная задача » в поле поиска зависимостей.

Как только это будет сделано, нажмите кнопку « Создать проект» , чтобы начать загрузку артефакта Maven.

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

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

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

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

Кроме того, поскольку Spring Cloud Task использует реляционную базу данных для хранения результатов выполненной задачи, нам нужно добавить зависимость к драйверу СУБД:

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

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

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

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

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

@EnableTask
@EnableBatchProcessing
@SpringBootApplication
public class BatchJobApplication {

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

3.3. Конфигурация задания

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

@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();
}
}

Подробная информация о том, как настроить и определить задание, выходит за рамки этой статьи. Для получения дополнительной информации вы можете ознакомиться с нашей статьей Introduction to Spring Batch .

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

mvn clean install

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

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

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

Перейдите в Spring Cloud Data Flow Shell и введите команду из командной строки:

app register --name batch-job --type task 
--uri maven://com.foreach.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]

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

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

Код примера можно найти в проекте GitHub .