4

異なるジョブ パラメータで複数回実行する必要があるジョブがあります。ジョブのクエリを実行するように JdbcCursorItemReader を設定したいのですが、itemReader は次のように構成されています。

<bean id="tpsItemReader" 
    class="org.springframework.batch.item.database.JdbcCursorItemReader">
    <property name="dataSource" ref="myDataSource"/>
    <property name="sql" value="#{sqlQueries['tps.findStuffforSomeSubset']}"/>
    <property name="preparedStatementSetter">
        <bean class="com.initech.reports.tps.ParameterSetter">
            <!-- can't hardcode this, I want a job parameter here -->
            <constructor-arg value="A"/> 
        </bean>
    </property>
    <property name="rowMapper">
        <bean class="com.initech.reports.tps.CustomerRowMapper"/>
    </property>
</bean>

ジョブは次のように構成されます。

<batch:job id="tpsReportJob">
    <batch:step id="tpsReportJob.generateReport">
        <batch:tasklet>
            <batch:chunk reader="tpsItemReader" 
            processor="tpsItemProcessor" 
            writer="tpsItemWriter" commit-interval="100000"/>
        </batch:tasklet>
    </batch:step>
</batch:job>

parameterSetter は非常に最小限です。

package com.initech.reports.tps;

import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.springframework.jdbc.core.PreparedStatementSetter;

public class ParameterSetter implements PreparedStatementSetter {

    private final String x;

    public ParameterSetter(String x) {this.x = x;}

    @Override
    public void setValues(PreparedStatement ps) throws SQLException {
        ps.setString(1, x);
    }
}

これは spring-batch 2.1.8 を使用しています。

クエリにジョブ パラメータを取得するにはどうすればよいですか?

私は近いと思います。パラメーターセッターの設定を次のように変更してみました:

        <bean class="com.initech.reports.tps.ParameterSetter">
            <constructor-arg value="#{jobParameters['myParam']}"/>
        </bean>

しかし、私はこのエラーが発生します:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:208)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:72)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:52)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:93)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:88)
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:139)
    ... 51 more

は非常によく似た質問を見つけました。それとこれの違いは、注釈を付けるリーダークラスがないことです。独自のitemReaderを作成する必要がないようにしたいので、xmlエントリがあるだけです。(注釈を付けるためだけに jdbcCursorItemReader クラスをオーバーライドしてみることができます...)

4

1 に答える 1

4

scope 属性を parameterSetter クラスに追加するだけで済みました。

    <bean class="com.initech.reports.tps.ParameterSetter"
        scope="step">
        <constructor-arg value="#{jobParameters['myParam']}"/>
    </bean>
于 2012-10-11T20:48:29.263 に答える