2016-02-18 3 views
1

ПриветSpring Batch архитектура

Я новичок в Spring Batch мире и последние дни я провел время на просмотр видео YouTube и Майкл Minella, прочитайте некоторые документы и успешно запустить некоторые демо-проекты, которые я нашел в Интернете. Я думаю, что Spring Batch - горячий кандидат на наши нужды. Но вот наш рассказ.

Я работаю в компании, которая разработала свои собственные схемы планирования и пакетной обработки более десяти лет назад для своего бизнес-отдела. Рамка способна запускать обработанные БД процессы, функции БД и динамические SQL. Излишне говорить, что это очень сложно поддерживать, поскольку слишком много людей с различными навыками развития сделали кодирование, и они больше не работают здесь. Наша структура может обрабатывать задания и шаги для последовательного запуска, а также async (как Spring Batch). У нас также есть репозиторий заданий, в котором хранятся все определения заданий (пользователи создают новые задания через графический интерфейс), экземпляры заданий с его контекстом (в случае, если сервер опускается, когда сервер работает, он возобновит выполнение задания). Мои вопросы следующие:

  1. Можем ли мы создавать новые рабочие места Spring Batch динамически (либо с помощью кода XML-ог) и через стандартные интерфейсы SB хранить их в JobRepository БД?
  2. Сегодня, в определенный период времени, у нас есть до сотни рабочих заданий одновременно. Они также повторно используют пул соединений в БД. Older Spring Batch ref documentation утверждает, что JobFactory создаст новый ApplicationContext для каждого выполнения задания. Как мы можем добиться повторного использования пулов соединений, если это имеет место в Spring Batch.
  3. Я знаю, что есть поддержка для продолжения неудачных шагов, но что, если сервер/приложение опустится, смогу ли я перезапустить свое приложение и получить экземпляр задания с его контекстом из JobRepository, чтобы продолжить с отказавшего шага?
  4. Может ли «step1.1» в «job1» зависеть от «шага 2.1» от «job2» в течение последнего часа? В таких сценариях я могу использовать прослушиватель шагов на «step1.1», чтобы выполнить это?


Сердечные приветы

Toto

ответ

0

У вас есть много материала здесь, чтобы покрыть, так что позвольте мне ответить одно очко в то время:

Можем ли мы создать новые рабочие места Spring Batch динамически (либо через XML или код) и через стандартные SB интерфейсы магазина их в базу данных JobRepository?

Можете ли вы генерировать определение задания динамически? Да. Мы делаем это в Spring XD в отношении частичной работы оркестра (составленное DSL-произведение используется, например, для создания XML-файла.

Есть ли в Spring Batch средства для этого? Нет. Вам нужно будет его закодировать сами.

Также обратите внимание, что вы должны хранить определение в своей собственной таблицы (схемы, определенной с помощью Spring Batch не имеет таблицу для этого).

Сегодня, в определенный период времени, у нас есть до ста исполнений выполнения одновременно. Они также повторно используют пул соединений в БД. Старая документация по пакетной загрузке Spring сообщает, что JobFactory создаст новый ApplicationContext для каждого задания exec социологическое загрязнение. Как мы можем добиться повторного использования пулов соединений, если это имеет место в Spring Batch.

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

Я знаю, что есть поддержка для продолжения неудачных шагов, но что, если сервер/приложение опустится, смогу ли я перезапустить мое приложение и получить экземпляр задания с его контекстом из JobRepository, чтобы продолжить с отказавшего шага?

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

Способ, которым я бы рекомендовал обрабатывать это через Spring XD или (в зависимости от ваших временных рамок) Spring Cloud Data Flow. Эти инструменты обеспечивают возможности оркестровки, в том числе перераспределение задания, если оно идет вниз. При этом он не будет перезапускать задание, которое выполнялось, если оно терпит неудачу, потому что это обычно требует определенного человеческого решения на основе использования. Однако Spring XD в настоящее время (и Spring Cloud Data Flow) будет иметь возможности реализовать что-то вроде этого довольно простым способом.

Может ли «step1.1» в «job1» зависеть от «шага 2.1» от «job2», заканчивающегося в течение последнего часа?В таких сценариях я могу использовать прослушиватель шагов на «step1.1», чтобы выполнить это?

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

Все, что вам нужно, в то время как вы можете выполнить большую часть того, что вы ищете с помощью Spring Batch, используя что-то вроде Spring XD или Spring Cloud Data Flow, сделает вашу жизнь намного проще.

+0

Thx для ответов и советов. Просто быстрый вопрос о продолжении, это нормально, чтобы выполнить сотню исполнений одновременно, т.е. имея так много ApplicationContexts (никогда не работали с более чем одним за раз) относительно производительности? – BTalker

+0

В одном JVM или несколько? –

+0

Одноместный JVM. Еще одна вещь, которую я хотел спросить. Выполняет ли Spring Batch задание async по умолчанию? Я вижу это происходит, когда я использую org.springframework.core.task.SimpleAsyncTaskExecutor, напр: '<боб ID = "jobLauncher" \t класс = "org.springframework.batch.core.launch.support.SimpleJobLauncher"> \t \t <свойство имя = "jobRepository" исх = "jobRepository" /> \t \t <имя свойства = "taskExecutor"> \t \t <боб класс = "org.springframework.core.task.SimpleAsyncTaskExecutor" /> \t \t ' – BTalker

0

Можем ли мы создавать новые рабочие места Spring Batch динамически (либо с помощью кода ог XML) и через стандартные интерфейсы SB хранить их в JobRepository DB ?

Легко использовать StepBuilderFactory, FlowBuilder и т.д., чтобы программно построить Spring Batch артефакты. Вероятно, вы захотите отбросить эти артефакты с помощью Spring Beans (чтобы получить хорошие возможности, такие как весовые области с шагами/заданиями, впрыскивание и т. Д.), И для этого вы можете использовать прототипы, объекты с охватом и областью действия, или даже использовать такие объекты как BeanDefinitionBuilder для динамического создания бобов.

Утвержденная документация по старой версии партии Spring Jobwork создает новый ApplicationContext для каждого выполнения задания. Как мы можем добиться повторного использования пулов соединений, если это имеет место в Spring Batch.

GenericApplicationContextFactory создает контекст дочернего приложения. Вы можете иметь «глобальные» компоненты в контексте родительского приложения.

Я знаю, что есть поддержка для продолжения неудачных шагов, но что, если сервер/приложение идет вниз, я смогу перезагрузить приложение и получить экземпляр задания с его контекстом из JobRepository, чтобы продолжить провальный шаг ?

Да, но not that easily.

Может ли «step1.1» в «job1» зависеть от «шага 2.1» от «job2» в течение последнего часа? В таких сценариях я могу использовать прослушиватель шагов на «step1.1», чтобы выполнить это?

A JobExecutionDecider, вероятно, будет лучшим вариантом.

+0

Вы упомянули, что легко создавать задания динамически, используя FlowBuilder и StepBuilderFactory. Можете ли вы представить образец кода? Что касается второй части хранения определений заданий в JobRepository (я не вижу ни одной таблицы, содержащей их)? – BTalker

+0

Определения заданий не хранятся в базе данных. Что касается использования 'StepBuilderFactory',' FlowBuilder', посмотрите на документацию. Для очень простой идеи посмотрите [здесь] (https://gist.github.com/cataphract/fe64ddfde81f58fe9784). – Artefacto

+0

При использовании StepBuilderFactory/FlowBuilder мне нужно сгенерировать определение задания, которое может быть сериализовано в БД. Это достижимо? Btw, в таблице _italic_batch_job_execution_italic_ есть столбец с значениями NULL, называемый _italic_JOB_CONFIGURATION_LOCATION_italic_. По звуку имени это, по-видимому, путь для определения задания (XML)? – BTalker