基于JobParameters动态切换ItemProcessor

时间:2014-01-24 02:17:45

标签: java spring spring-batch

以下是读者bean的代码示例

<bean id="reader"
        class="org.springframework.batch.item.database.JdbcCursorItemReader"
        scope="step">
    <property name="dataSource" ref="dataSource" />
    <property name="sql"
        value="#{@sqlStatements[jobParameters['key']]}" />
    <property name="rowMapper" ref="#{jobParameters['key'] + 'Mapper'}" />
</bean>

<util:map id="sqlStatements"/>。我有一个类似的作家豆。我想要一个用于处理器的动态切换器。界面ItemProcessor<I,O>需要I&amp;要提到O,要么必须以某种方式切换它,要么创建自定义ItemProcessor。

我尝试了下面的代码,但它没有用。

<batch:job id="springBatch">
    <batch:step id="step1">
        <batch:tasklet>
            <batch:chunk reader="reader" processor="#{jobParameters['key'] + 'Processor'}"
                writer="writer" commit-interval="1"></batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

它为jobParameters提供了org.springframework.expression.spel.SpelEvaluationException,可能是因为没有为它定义scope=step

有人可以为此提供替代方案吗?

2 个答案:

答案 0 :(得分:3)

使用Classifier可以简化此问题的大量解决方案:创建自定义ItemProcessor<Object, Object>并注入Classifier<Class, ItemProcessor>PatternMatchingClassifier可以适合)并{{1使用分类器检测正确的处理器 另请查看ClassifierCompositeItemWriter

答案 1 :(得分:0)

不确定我是否完全按照您的问题,但一个简单的解决方案是创建自定义处理器作为委托人。该委托者将根据作业参数键或您想要的任何逻辑将处理器代码委托给相关的Item Processor类。