2015-09-18 12 views
5

Próbuję zrobić Spring Batch i nie mam z tym doświadczenia.Przekazywanie informacji między krokami na wiosnę?

Czy można przekazywać informacje z każdego etapu wsadowego lub czy muszą one być całkowicie niezależne?

Na przykład jeśli mam

<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> 

And getSQLs wyzwala fasoli, która wykonuje klasy, która generuje listę typu String. Czy można odwołać się do tej listy dla komponentu bean uruchamianego przez komendy runSQL? („Wyzwalane” nie może być dobrym termin, ale myślę, że wiesz co mam na myśli)

UPDATE: Więc krok getSQLs wyzwala to Fasola:

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

który wyzwala klasę myTask która wykonuje tę metodę:

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

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

    return RepeatStatus.FINISHED; 
} 

Czy muszę jakoś przekazać krok Execution do metody execute?

Odpowiedz

6

Spring Batch obsługuje przesyłanie danych do przyszłych etapów pracy, a to można zrobić za pomocą ExecutionContext, a dokładniej JobExecutionContext. Tutaj mam na myśli example from the official documentation, jak to jest ostatecznym punktem odniesienia dla mnie:

Aby dane dostępne do przyszłych działań, będzie musiał być „promowane” do pracy ExecutionContext po zakończeniu etapu . Spring Batch dostarcza ExecutionContextPromotionListener dla tego celu .

Słuchacz powinien być skonfigurowany z kroku, jeden wymiany danych z przyszłych nich:

<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> 

Dane powinny być zaludnione z kodu bloku wykonania następująco:

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

Następnie, w kolejnych krokach, ten List może być odzyskany z hakiem po obliczeniu z przypisaną @BeforeStep a jak następuje:

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

Mój kod nie wydają się rozpoznać stepExecution. Zaimportowałem org.springframework.batch.core.StepExecution. Czego tu mi brakuje? – user2665166

+0

Powinieneś raczej zaktualizować wpis blokami kodu i wspomnieć o tym, co zrobiłeś do tej pory. – tmarwen

+0

Zaktualizowano. Zmieniłem również krok, aby dopasować Twój przykład. – user2665166

0

Sposób konfigurowania java.

Etap 1: Konfiguracja ExecutionContextPromotionListener

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

    } 

Etap 2: Konfiguracja krok z ExecutionContextPromotionListener
@Bean

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

Etap 3: uzyskanie dostępu do danych procesora

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

Krok 4: ustawienie danych w procesorze

@BeforeStep 
     public void beforeStep(StepExecution stepExecution) { 
      stepExecution.getJobExecution().getExecutionContext().put("MY_KEY", My_value); 
     } 
Powiązane problemy