JobParameters de Spring Batch

Je suis en train d'injecter des paramètres de travail dans un personnalisé ItemReader. J'ai passé en revue tous les StackOverflow notes sur le sujet (exemple: Comment obtenir l'accès aux paramètres de travail de ItemReader, Spring Batch?), et je vois c'est une douleur commune point qui est le plus souvent en suspens. J'espère qu'un printemps gourou (@Michael Minella n'importe qui) va voir cela et d'avoir quelques connaissances.

J'ai eu comme la mesure de déterminer que la jobparameters sont disponibles environ une personne sur 10 courses, même sans code ou les changements de configuration. C'est une affaire de hasard réussite plutôt que d'une erreur aléatoire, de sorte qu'il s'avère difficile à traquer.

J'ai creusé le printemps de code avec le débogueur, et a déterminé que lorsque cela ne fonctionne pas, pas de fève du nom jobParameters est enregistré au Printemps, au moment de l'injection.

Je suis à l'aide de Printemps 4.1.4 avec spring-batch 3.0.2 et spring-data-jpa 1.7.1 et printemps-données communes 1.9.1, la course en java 8.

Classe 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;
    }
}

Emploi de lancement paramètres:

launch-context.xml job1 jobid(long)=1

launch-context.xml (moins le 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 (moins le 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> 
comment voulez-vous lancer l'emploi?
Et, pourquoi êtes-vous à l'aide de @Lazy pour l'injection? C'est que de besoin pour votre tâche?
Je suis en train de lancer la tâche à partir de l'intérieur de mon IDE eclipse, pour l'instant. Il sera lancé à partir de la ligne de commande quand il va vivre. J'utilise @Paresseux, car il me permet de contourner ce problème et de continuer le projet réel, dans l'attente d'une résolution. Il y a d'autres façons d'obtenir les paramètres dans il bean, mais ils vont créer des problèmes de prise en charge à long terme.

OriginalL'auteur pojo-guy | 2015-01-09