2014-02-17 2 views
1

В соответствии с Пружинный Batch документации (http://docs.spring.io/spring-batch/2.2.x/reference/html/configureStep.html#controllingStepFlow), этап управления потоком в файле XML конфигурации очень прост:Управление Спринг-Пакетный Шаг потока в Java-конфигурации способом

например, Я мог бы написать следующую конфигурацию задания:

<job id="myJob"> 
    <step id="step1"> 
     <fail on="CUSTOM_EXIT_STATUS"/> 
     <next on="*" to="step2"/> 
    </step> 

    <step id="step2"> 
     <end on="1ST_EXIT_STATUS"/> 
     <next on="2ND_EXIT_STATUS" to="step10"/> 
     <next on="*" to="step20"/> 
    </step> 

    <step id="step10" next="step11" /> 
    <step id="step11" /> 

    <step id="step20" next="step21" /> 
    <step id="step21" next="step22" /> 
    <step id="step22" /> 
</job> 

есть простой способ определения такой конфигурации заданий в Java-конфигурации таким образом? (используя JobBuilderFactory и т. д.)

ответ

1

Возможно. Если ваши намерения состоят в том, чтобы написать что-то похожее на решение потока «программно» (с использованием интерфейсов среды SB, я имею в виду), есть встроенная реализация и этого достаточно для большинства случаев использования.

В отличие от конфигурации XML вы можете использовать аннотации JavaConfig, если вы знакомы с ними; лично я предпочитаю определение XML, но это только личное мнение.

1

Как упоминается в документации, мы можем разветвить поток только на основе состояния выхода на шаг. Чтобы иметь возможность сообщать пользовательский статус выхода (возможно, отличный от того, который был автоматически отображен из состояния пакетной обработки), мы должны предоставить метод afterStep для StepExecutionListener.

Предположим, у нас есть первый шаг step1 (экземпляр Tasklet класса Step1), и мы хотим сделать следующее:

  • если step1 терпит неудачу (например, бросая исключение времени выполнения), то вся работу следует рассматривать как FAILED.
  • если step1 завершает с выходом статус COMPLETED-WITH-A, то мы хотим перейти на какой-то шаг step2a, который якобы обрабатывает этот конкретный случай.
  • в противном случае мы остановимся на главном грузовике работы и продолжим шаг step2.

Теперь обеспечивает afterStep метод внутри Step1 класса (также реализующих StepExecutionListener):

private static class Step1 implements Tasklet, StepExecutionListener 
{ 
    @Override 
    public ExitStatus afterStep(StepExecution stepExecution) 
    { 
     logger.info("*after-step1* step-execution={}", stepExecution.toString()); 

     // Report a different exit-status on a random manner (just a demo!). 
     // Some of these exit statuses (COMPLETED-WITH-A) are Step1-specific 
     // and are used to base a conditional flow on them. 

     ExitStatus exitStatus = stepExecution.getExitStatus(); 
     if (!"FAILED".equals(exitStatus.getExitCode())) { 
      double r = Math.random(); 
      if (r < 0.50) 
       exitStatus = null; // i.e. COMPLETED 
      else 
       exitStatus = new ExitStatus(
        "COMPLETED-WITH-A", 
        "Completed with some special condition A"); 
     } 
     logger.info("*after-step1* reporting exit-status of {}", exitStatus); 
     return exitStatus; 
    } 

    // .... other methods of Step1 
} 

Наконец, построить поток рабочих мест внутри createJob метода нашего JobFactory реализации:

@Override 
public Job createJob() 
{ 
    // Assume some factories returning instances of our Tasklets 
    Step step1 = step1(); 
    Step step2a = step2a(); 
    Step step2 = step2(); 

    JobBuilder jobBuilder = jobBuilderFactory.get(JOB_NAME) 
     .incrementer(new RunIdIncrementer()) 
     .listener(listener); // a job-level listener 

    // Build job flow 
    return jobBuilder 
     .start(step1) 
      .on("FAILED").fail() 
     .from(step1) 
      .on("COMPLETED-WITH-A").to(step2a) 
     .from(step1) 
     .next(step2) 
     .end() 
     .build(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^