カスタムItemReaderにジョブパラメータを挿入しようとしています。この件に関するStackOverflowのメモをすべて確認しました(例:Spring BatchでItemReaderからジョブパラメーターにアクセスする方法は?)。これは、ほとんど解決されていない一般的な問題点であることがわかります。春の第一人者(@Michael Minella誰でも)がこれを見て、いくつかの洞察を持ってくれることを願っています。
コードや構成を変更しなくても、ジョブパラメータは10回に1回の実行で利用可能であると判断できました。これはランダムな失敗ではなくランダムな成功の場合であるため、追跡するのは困難です。
デバッガーでSpringコードを掘り下げてみたところ、これが失敗すると、インジェクションが行われているときにjobParametersという名前のBeanがSpringに登録されていないことがわかりました。
私はSpring4.1.4とspring-batch3.0.2、spring-data-jpa 1.7.1、spring-data-commons 1.9.1を使用しており、java8で実行しています。
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;
}
}
ジョブ起動パラメータ:
launch-context.xml job1 jobid(long)=1
launch-context.xml(綿毛を除く):
<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(綿毛を除く):
<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>
ジョブパラメータを機能させるための重要な手順は、StepScope
Beanを定義し、リーダーが@StepScope
コンポーネントであることを確認することです。
私は次のことを試みます:
まず、step-beanが定義されていることを確認します。これは、Java構成を使用してセットアップするのに適しています。
@Configuration
public class JobFrameworkConfig {
@Bean
public static StepScope scope() {
return new StepScope();
}
// jobRegistry, transactionManager etc...
}
次に、@StepScope
-annotationを使用してBeanがステップスコープになっていることを確認します(ほとんど例のように)。@Value
ではないを注入し@Lazy
ます。
@Component("sourceSelectionReader")
@StepScope // required, also works with @Scope("step")
public class SourceSelectionReaderImpl implements ItemReader<MyThing> {
private final long myParam;
// Not lazy, specified param name for the jobParameters
@Autowired
public SourceSelectionReaderImpl(@Value("#{jobParameters['myParam']}") final long myParam) {
this.myParam = myParam;
}
// the rest of the reader...
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加