Sto tentando di inserire parametri di lavoro in un oggetto personalizzato. Ho esaminato tutte le note StackOverflow sull'argomento (esempio: How to get access to job parameters from ItemReader, in Spring Batch?) e vedo che questo è un punto di dolore comune che è per lo più irrisolto. Spero che un guru primaverile (@Michael Minella chiunque) vedrà questo e avrà qualche intuizione.Parametri lavoro da Spring Batch
Ho ottenuto fino a determinare che i parametri di lavoro sono disponibili su una delle 10 esecuzioni, anche senza codice o modifiche di configurazione. Questo è un caso di successo casuale piuttosto che un fallimento casuale, quindi è difficile da rintracciare.
Ho scovato il codice sorgente con il debugger e ho stabilito che quando questo fallisce, nessun bean del nome jobParameters viene registrato in primavera nel momento in cui avviene l'iniezione.
Sto usando Primavera 4.1.4 con molla-batch 3.0.2 e la primavera-dati-JPA 1.7.1 e la primavera-dati-commons 1.9.1, in esecuzione in Java di classe 8.
Java
@Component("sourceSelectionReader")
@Scope("step")
public class SourceSelectionReaderImpl
implements ItemReader<MyThing> {
private Map<String,Object> jobParameters;
// ... snip ...
@Autowired
@Lazy
@Qualifier(value="#{jobParameters}")
public void setJobParameters(Map<String, Object> jobParameters) {
this.jobParameters = jobParameters;
}
}
dei parametri del processo di lancio:
launch-context.xml job1 jobid(long)=1
lancio-context.xml (meno il fluff):
<context:property-placeholder location="classpath:batch.properties" />
<context:component-scan base-package="com.maxis.maximo.ilm" />
<jdbc:initialize-database data-source="myDataSource" enabled="false">
<jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database>
<batch:job-repository id="jobRepository"
data-source="myDataSource"
transaction-manager="transactionManager"
isolation-level-for-create="DEFAULT"
max-varchar-length="1000"/>
<import resource="classpath:/META-INF/spring/module-context.xml" />
Module-context.xml (meno il fluff):
<description>Example job to get you started. It provides a skeleton for a typical batch application.</description>
<import resource="classpath:/META-INF/spring/hibernate-context.xml"/>
<import resource="classpath:/META-INF/spring/myapp-context.xml"/>
<context:component-scan base-package="com.me" />
<bean class="org.springframework.batch.core.scope.StepScope" />
<batch:job id="job1">
<batch:step id="step0002" >
<batch:tasklet transaction-manager="transactionManager" start-limit="100" >
<batch:chunk reader="sourceSelectionReader" writer="selectedDataWriter" commit-interval="1" />
</batch:tasklet>
</batch:step>
</batch:job>
come si avvia il lavoro? – wassgren
E, perché stai usando '@ Lazy' per l'iniezione? È necessario per il tuo compito? – wassgren
Sto avviando il lavoro dall'interno del mio IDE eclissi, per ora. Verrà lanciato dalla riga di comando quando verrà attivato. Io uso @Lazy perché mi consente di aggirare questo problema e andare avanti con il progetto reale, in attesa di una risoluzione. Ci sono altri modi per inserire i parametri nel bean, ma a lungo andare creeranno problemi di supporto. –