Nano Hash - криптовалюты, майнинг, программирование

Почему пакетный поток с этим условием включен в бесконечный цикл в весеннем пакете?

Я злонамеренно сделал код, чтобы проверить, как работает пакетный поток.

@Bean
public Step conditionalJobStep1() {
   return stepBuilderFactory.get("step1")
                            .tasklet((contribution, chunkContext) -> {
                                log.info(">>>>> This is stepNextConditionalJob Step1");
                                return RepeatStatus.FINISHED;
                            }).build();
}

@Bean
public Step conditionalJobStep2() {
   return stepBuilderFactory.get("conditionalJobStep2")
                            .tasklet((contribution, chunkContext) -> {
                                log.info(">>>>> This is stepNextConditionalJob Step2");
                                return RepeatStatus.FINISHED;
                            }).build();
}

@Bean
public Step conditionalJobStep3() {
   return stepBuilderFactory.get("conditionalJobStep3")
                            .tasklet((contribution, chunkContext) -> {
                                log.info(">>>>> This is stepNextConditionalJob Step3");
                                return RepeatStatus.FINISHED;
                            }).build();
}

Вот шаги и тасклеты.

@Bean
public Job stepNextConditionalJob() {
    return jobBuilderFactory.get("stepNextConditionalJob")
                        .start(conditionalJobStep1())
                            .on("FAILED")
                            .to(conditionalJobStep3())
                            .on("*")
                            .end()
                        .from(conditionalJobStep1())
                            .on("*")
                            .to(conditionalJobStep3())
                            .next(conditionalJobStep2())
                            .on("*")
                            .to(conditionalJobStep1())
                            .on("*")
                            .end()
                        .end()
                            .build();
}

приведенные выше результаты кода 1-›3-›2-›1-›3-›2-›1-›..... инф. Я думал, что делает этот поток.

Мое мнение: шаг 1 не НЕУДАЧЕН, поэтому начните (1) -> до (1) и из (1) -> (3) -> (2) -> до (1) и из (1) -> (3) -› (2) -› ...

но когда я изменил всего 2 числа, как это задание (код, который изменил только Step2 и Step3 по сравнению с предыдущим кодом после from (step1)) приводит только к 1-> 2-> 3-> Конец задания.

@Bean
public Job stepNextConditionalJob() {
    return jobBuilderFactory.get("stepNextConditionalJob")
                        .start(conditionalJobStep1())
                            .on("FAILED")
                            .to(conditionalJobStep3())
                            .on("*")
                            .end()
                        .from(conditionalJobStep1())
                            .on("*")
                            .to(conditionalJobStep2())
                            .next(conditionalJobStep3())
                            .on("*")
                            .to(conditionalJobStep1())
                            .on("*")
                            .end()
                        .end()
                            .build();
}

Многие из собственных экспериментов относятся к сразу после старта.

Я не знаю, почему это так работает.

Что делает эту разницу?


  • Отвечает ли это на ваш вопрос? Условный поток Spring создаёт бесконечный цикл 22.02.2021
  • Нет, я уже знаю этот процесс. Я просто изменил порядок двух одинаковых шагов, но я спрашиваю, потому что мне любопытно окончание обычной работы и бесконечный процесс. 23.02.2021

Ответы:


1

Ваш поток не определяет результат шага 2 на *. У тебя есть:

.to(conditionalJobStep3())
.on("*")
.end()

и

.to(conditionalJobStep1())
.on("*")
.end()

но нет такой конструкции для шага 2. Единственный результат, который вы определили для шага 2:

.next(conditionalJobStep2())
.on("*")
.to(conditionalJobStep1())

Это означает, что независимо от кода выхода шага 2 перейдите к conditionalJobStep1. Вот почему вы видите 1->3->2->1->3->2->1->....

Я не знаю, почему это так работает. Что делает эту разницу?

Это работает, когда вы переключаете шаг 2 на шаг 3, потому что вы определили результат * для шага 3: .to(conditionalJobStep3()).on("*").end().

Я рекомендую использовать следующий синтаксис для определения всех результатов для каждого шага:

 jobBuilderFactory.get("stepNextConditionalJob")
   .from(stepA).on(ExitCode1).to(StepB)
   .from(stepA).on(ExitCode2).to(StepC)
   .from(stepA).on("*").end()
   ...
   .from(stepX).on(ExitCode1).to(StepY)
   .from(stepX).on(ExitCode1).to(StepZ)
   .from(stepX).on("*").end()
 .build()

Это более явно и менее подвержено забыванию исходящих переходов.

23.02.2021
  • Могу ли я понять, что вы рекомендуете (начать) задание и разделить дело на детали с помощью (с~на~до)? (Я спрашиваю, потому что не вижу начало, которое я обычно использую для запуска задания.) 23.02.2021
  • Да, вы можете начать определение потока с jobBuilderFactory.get("stepNextConditionalJob").from(stepA)..., а не с jobBuilderFactory.get("stepNextConditionalJob").start(stepA)... Оба синтаксиса эквивалентны, если поток определен правильно. Я рекомендую тот, что в ответе, потому что он более явный и менее подвержен забыванию переходов. 24.02.2021
  • Большое тебе спасибо. Благодаря вам я все понял! 24.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..