2014-12-31 10 views
5

Sto cercando di configurare un flusso in primavera lotto usando java-config, questo flusso ha fondamentalmente a che fare questo:Primavera Batch (java-config) di eseguire il punto dopo un jobExeuctionDecider

  1. Eseguire un init passo (che aggiunge un record nel database),

  2. quindi eseguire un decisore per controllare file di esistenza,

2,1. Se i file esistono eseguirà il lavoro di caricamento (che è un altro flusso con una serie di passaggi in parallelo)

  1. Eseguire un passaggio di fine (che aggiunge un record nel database), questo dovrebbe sempre essere eseguito, anche se 2.1 non è stato eseguito.

Ho provato a fare questa configurazione, ma il passo finitura non corre:

 Flow flow = new FlowBuilder<SimpleFlow>("commonFlow") 
      .start(stepBuilderFactory.get("initStep").tasklet(initTasklet).build()) 
      .next(decider) 
       .on(FlowExecutionStatus.COMPLETED.getName()) 
        .to(splitFlow) 
       .from(decider).on("*") 
        .end() 
    .next(stepBuilderFactory.get("finishStep").tasklet(finishTasklet).build()) 
      .end(); 

Sono in grado di farlo funzionare facendo come di seguito, ma non è affatto elegante:

Step finishStep = stepBuilderFactory.get("finishStep").tasklet(finishTasklet).build(); 

    Flow flow = new FlowBuilder<SimpleFlow>("commonFlow") 
      .start(stepBuilderFactory.get("initStep").tasklet(initTasklet).build()) 
      .next(decider) 
       .on(FlowExecutionStatus.COMPLETED.getName()) 
        .to(splitFlow) 
        .next(finishStep) 
       .from(decider).on("*") 
        .to(finishStep) 
      .end(); 

Qualcuno sa qual è il modo giusto per eseguire un passaggio dopo una decisione che utilizza java-config?

+0

Nel tuo primo codice di esempio, hai incluso due 'end()'. Prova a rimuovere il primo 'end()'. –

+0

Il ritorno di .on è un TransitionBuilder, devo avere qualcosa dopo l'on. Ho anche provato a mettere un passo stupido dopo l'on, ma non ha funzionato. –

risposta

1

Sembra che questo venga reso MOLTO più complicato di quanto dovrebbe essere. Non è necessario configurare un flusso o un decisore. Questo è un lavoro dentro e fuori MOLTO semplice.

L'opzione più semplice consiste nell'utilizzare Spring Integration per rilevare i regali di un file e attivare il lavoro.

L'opzione successiva più semplice è quella di avere un controllo del processo al quarzo o CRON per il file e avviare il processo batch.

Ultimo ma non meno importante, è possibile eseguire il lavoro e se l'ItemReader non riesce a trovare il/i file/i, basta ingoiare l'eccezione. Oppure imposta un Listener FileItemReader per verificare la presenza di file su di esso prima del metodo.

+0

Questo è solo un pezzo dell'intero flusso. Come puoi vedere, finishFlow dovrebbe essere eseguito indipendentemente dal fatto che il file esista o meno. Le opzioni che hai presentato si attivano solo quando viene creato un file. La domanda riguarda la configurazione stessa. –

+0

Bene se non importa se il file è lì o no, perché viene usato un decisore. Allora esegui il lavoro allora. Controlla che il file esegua i passaggi, incluso l'ultimo. – BrianC

Problemi correlati