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>
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
Vous devez vous connecter pour publier un commentaire.
Les étapes importantes pour obtenir des Paramètres de Travail de travail est de définir le
StepScope
bean et assurez-vous que votre lecteur est un@StepScope
composant.Je voudrais essayer le suivant:
Assurez-vous d'abord qu'il y est une étape-bean défini. C'est agréable d'installation à l'aide de Java Configuration:
Ensuite, assurez-vous que votre bean est l'étape dont l'étendue est définie par l'utilisation de la
@StepScope
-annotation (presque comme dans votre exemple). Injecter un@Value
qui n'est pas@Lazy
.bizarre échec. Veuillez observer qu'il existe une classe appelée
StepScope
ET une annotation appelé@StepScope
. Pas pratique 😉Sur un autre thread, accidentel de mandataire avec StepScope a été discuté. Par @Mike Manella (Spring Batch tech lead) StepScope est un raccourci de la commodité pour la Portée("étape", ...). La résolution, qui est de comprendre et d'appliquer le Champ d'application d'annotation avec les paramètres corrects Quand j'ai une chance, je vais appliquer ces et présenter les résultats.
Cela résout le double de serveur proxy, mais il n'y a pas encore de jobParameters bean présenter pour être branché lorsque la classe de lecteur est en cours de chargement. Je l'ai un problème avec dépareillés contextes ou je suis absent quelque chose qui est tellement attendu que nul ne pense à elle.\
Est-ce peut-être liés aux nombreuses questions liées à la jira.printemps.io/parcourir/SPR-12111 ?
OriginalL'auteur wassgren
Essayez d'ajouter @DependsOn("jobParameters") après @Component("sourceSelectionReader")
OriginalL'auteur Pavan