2013-02-19 11 views
9

Desidero recuperare l'oggetto JobParameter e JobExecutionContext nella mia classe ItemWriter. Come procedere?Come ottenere JobParameter e JobExecutionContext in ItemWriter?

Ho provato a implementare StepExecutionListener tramite il quale sto solo chiamando i metodi della classe genitore. Ma non ci sta riuscendo.

Grazie in anticipo.

+1

Ho risolto il problema precedente estendendo la classe StepExecutionListenerSupport. Dopo aver sovrascritto il metodo della classe padre che è'beforeStep 'public void beforeStep (StepExecution stepExecution) {// TODO Metodo generato automaticamente stub this.stepExecution = stepExecution; } – Smita

risposta

15

L'implementazione di StepExecutionListener è a senso unico. In effetti, questo è l'unico modo in Spring Batch 1.x.

A partire da Spring Batch 2, si ha un'altra scelta: è possibile inserire tutte le voci in Parametri lavoro e Contesto esecuzione lavoro per il proprio writer articoli. Crea il tuo articolo con lo scope step, quindi usa espressioni come #{jobParameters['theKeyYouWant']} o #{jobExecutionContext['someOtherKey']} per l'iniezione di valore per il tuo articolo.

+1

Adrian, puoi chiarire che questo è il modo corretto di iniettare JobExecutionContext in un lettore, scrittore o processore: 1) in config, inject nel bean: , quindi 2) nel bean: contesto JobExecutionContext privato; (non c'è bisogno di @Value) C'è qualcosa che manca o che non va? Grazie mille – user1052610

+0

1. hai bisogno che il bean sia in scope scope, 2. hai bisogno di setter per la proprietà "context". –

+0

Come si comporta quando si eseguono più lavori contemporaneamente? problemi thread-safe? – rayman

9

Utilizzare l'annotazione @BeforeStep per chiamare un metodo prima dell'elaborazione del passo.

//From the StepExecution get the current running JobExecution object. 
// 
public class MyDataProcessor implements ItemProcessor<MyDataRow, MyDataRow> 
{ 
    private JobExecution jobExecution; 

    @BeforeStep 
    public void beforeStep(StepExecution stepExecution) { 
     jobExecution = stepExecution.getJobExecution(); 
} 
6

Per aggiungere alla risposta di Adrian Shum, se si vuole evitare ogni parametro di lavoro da iniettare come una proprietà di classe, è possibile iniettare direttamente le Map di JobParameter s come segue:

@Value("#{jobParameters}") 
private Map<String, JobParameter> jobParameters; 
4

Se si utilizza il file di configurazione di Primavera, è possibile accedere all'oggetto StepExecution con:

<bean id="aaaReader" class="com.AAAReader" scope="step"> 
    <property name="stepExecution" value="#{stepExecution}" /> 
</bean> 

In classe AAAReader è necessario creare il campo corretto un d un setter:

private StepExecution stepExecution; 

public void setStepExecution(final StepExecution stepExecution) { 
    this.stepExecution = stepExecution; 
} 

Lo stesso vale per le classi del processore e scrittore.

+0

Impressionante .. Salva un giorno per il mio amico .. – venugopal

Problemi correlati