2015-01-09 6 views
5

カスタムItemReaderにジョブパラメータを注入しようとしています。私は主題に関するStackOverflowのノート(例:How to get access to job parameters from ItemReader, in Spring Batch?)をすべて見直しましたが、これはほとんど解決されていない共通の苦境点です。私は春の教祖(@Michael Minellaの誰でも)がこれを見て、いくつかの洞察力を持っていることを望んでいます。SpringバッチのJobParameters

私は、コードや設定の変更がなくても、10回のうち1回についてジョブパラメータが利用可能であると判断しました。これは、ランダムな障害ではなくランダムな成功のケースであるため、追跡が困難であることがわかります。

私はデバッガでスプリングコードを掘り下げ、失敗したときに、注入が行われているときに、jobParametersという名前のBeanがSpringに登録されていないことを確認しました。

私はJavaで8

Javaクラス

を実行している、春バッチ3.0.2と春データ-JPA 1.7.1と春・データ・コモンズ1.9.1と春の4.1.4を使用しています
@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 

打ち上げ-の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" /> 

モジュール-の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> 
+0

どのようにジョブを起動しますか? – wassgren

+0

そして、注射に '@ Lazy'を使っているのはなぜですか?それはあなたの仕事に必要なのでしょうか? – wassgren

+0

私は今、Eclipse IDE内からジョブを起動しています。ライブになるとコマンドラインから起動します。 私はこの問題を回避し、実際のプロジェクトで解決を待つために@Lazyを使用します。 Beanにパラメータを渡す方法は他にもありますが、長期的にはサポートの問題が生じます。 –

答えて

2

重要なステップの後@DependsOn( "jobParameters")を追加してください作業はStepScope beanを定義し、リーダーが@StepScopeコンポーネントであることを確認することです。

私は次のことをしようとするだろう:

まず定義されたステップ豆があることを確認してください。これは、Javaの設定を使用してセットアップにいいです:

@Configuration 
public class JobFrameworkConfig { 
    @Bean 
    public static StepScope scope() { 
     return new StepScope(); 
    } 
    // jobRegistry, transactionManager etc... 
} 

はその後、あなたのBeanが(ほとんどあなたの例のように) @StepScope -annotationを使用することにより、ステップ・スコープされていることを確認してください。 @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... 
} 
+0

- Beanは初期化されますが、ステップスコープのジョブパラメータは使用できません。 @StepScopeを使用して、Beanが初期化に失敗: は、最終的なクラスのクラスcom.sun.proxyをサブクラス化することはできませんorg.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)で$ Proxy42 \t ...。 –

+0

@ pojo-guy、奇妙な失敗。 'StepScope'と呼ばれるクラスと@StepScopeというアノテーションがあることに注意してください。不便;) – wassgren

+0

別のスレッドでは、StepScopeを使用して誤ってプロキシを行う方法について説明しました。 @Mike Manella(Spring Batch tech lead)によると、StepScopeはScope( "step"、...)のための便利なショートカットです。そのための解決策は、スコープアノテーションを正しいパラメータで理解して適用することです。 私はチャンスがあるとき、これらを適用して結果を報告します。 –

-1

ジョブパラメータを取得する@Component( "sourceSelectionReader")

+0

これは、jobParametersという名前のBeanが存在しないことを確認します。 @Scope( "step")を使用していただきありがとう –

関連する問題