2015-09-18 2 views
5

Я пытаюсь сделать Spring Batch, и у меня нет опыта с ним.Информация о переходе между ступенями весной?

Возможно ли передавать информацию с каждого этапа партии или они должны быть полностью независимыми?

Например, если у меня есть

<batch:step id="getSQLs" next="runSQLs"> 
     <batch:tasklet transaction-manager="TransactionManager" 
      ref="runGetSQLs" /> 
    </batch:step> 

    <batch:step id="runSQLs"> 
     <batch:tasklet transaction-manager="TransactionManager" 
      ref="runRunSQLs" /> 
    </batch:step> 

И getSQLs запускает боб, который выполняет класс, который создает список типа String. Можно ли ссылаться на этот список для компонента, запускаемого runSQL? («Срабатывает» не может быть правильным термином, но я думаю, вы знаете, что я имею в виду)

UPDATE: Так getSQLs шаг вызывает этот компонент:

<bean id="runGetSQLs" class="myTask" 
    scope="step"> 
    <property name="filePath" value="C:\Users\username\Desktop\sample.txt" /> 
</bean> 

, который запускает класс myTask, который выполняет этот метод:

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

    ExecutionContext stepContext = this.stepExecution.getExecutionContext(); 
    stepContext.put("theListKey", sourceQueries); 

    return RepeatStatus.FINISHED; 
} 

Должен ли я как-то передать stepExecution методу выполнения?

ответ

6

Spring Batch поддерживает перенос данных в будущие этапы работы, и это можно сделать с помощью ExecutionContext, точнее JobExecutionContext. Здесь я имею в виду example from the official documentation, как это конечная ссылка для меня:

Для того, чтобы доступные для будущих шагов данных, он должен будет быть «повышен» до исполнения ExecutionContext работы после стадии завершения , Spring Batch предоставляет ExecutionContextPromotionListener для этой цели .

Слушатель должен быть настроен с шагом, один обменом данные с будущими из них:

<batch:step id="getSQLs" next="runSQLs"> 
    <batch:tasklet transaction-manager="TransactionManager" 
     ref="runGetSQLs" /> 
    <listeners> 
     <listener> 
      <beans:bean id="promotionListener" class="org.springframework.batch.core.listener.ExecutionContextPromotionListener"> 
       <beans:property name="keys" value="theListKey"/> 
      </beans:bean> 
     </listener> 
    </listeners> 
</batch:step> 

<batch:step id="runSQLs"> 
    <batch:tasklet transaction-manager="TransactionManager" 
     ref="runRunSQLs" /> 
</batch:step> 

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

// ... 
ExecutionContext stepContext = this.stepExecution.getExecutionContext(); 
stepContext.put("theListKey", yourList); 

Затем на последующих этапах этот List может быть извлечен с помощью крючка пост-счета, аннотированного @BeforeStep a следующим образом:

@BeforeStep 
public void retrieveSharedData(StepExecution stepExecution) { 
    JobExecution jobExecution = stepExecution.getJobExecution(); 
    ExecutionContext jobContext = jobExecution.getExecutionContext(); 
    this.myList = jobContext.get("theListKey"); 
} 
+0

Мой код не признать stepExecution. Я импортировал org.springframework.batch.core.StepExecution. Что мне здесь не хватает? – user2665166

+0

Вам следует скорее обновить сообщение блоками кода и указать, что вы сделали до сих пор. – tmarwen

+0

Обновлено. Я также изменил этот шаг в соответствии с вашим примером. – user2665166

0

java config way.

Шаг 1: Настройка ExecutionContextPromotionListener

@Bean 
    public ExecutionContextPromotionListener executionContextPromotionListener() 
    { 
     ExecutionContextPromotionListener executionContextPromotionListener = new ExecutionContextPromotionListener(); 
     executionContextPromotionListener.setKeys(new String[] {"MY_KEY"}); 
     return executionContextPromotionListener; 

    } 

Шаг 2: Настройка Шаг с ExecutionContextPromotionListener
@Bean

public Step myStep() { 
     return stepBuilderFactory.get("myStep") 
       .<POJO, POJO> chunk(1000) 
       .reader(reader()     
       .processor(Processor()) 
       .writer(Writer() 
       .listener(promotionListener()) 
       .build(); 
    } 

Шаг 3: Доступ к данным в процессоре

@BeforeStep 
    public void beforeStep(StepExecution stepExecution) { 
     jobExecutionContext = stepExecution.getJobExecution().getExecutionContext(); 
     jobExecutionContext.getString("MY_KEY") 
    } 

Шаг 4: установка данных в процессоре

@BeforeStep 
     public void beforeStep(StepExecution stepExecution) { 
      stepExecution.getJobExecution().getExecutionContext().put("MY_KEY", My_value); 
     } 
Смежные вопросы