2

我有一个批处理作业,我想每分钟运行一次。调度程序按计划每分钟启动一次作业,但在第一次启动后,将使用相同的作业实例。我的 ItemReader 中有一个标志,一旦代码执行一次就会触发,因此每次后续启动都使用相同的实例,在第一次运行后不会读取任何新内容。

我查看了文档(http://static.springsource.org/spring-batch/reference/html/configureJob.html),它说将作业bean的restartable属性设置为false。这应该强制每次调用都创建一个新实例(第 4.1.1 节可重启性)。

这并没有解决问题。如果我写出“this.hashCode()”,每次调用读取器类时都会得到相同的哈希 ID。

我尝试将可重启属性放在作业及其父级(SimpleJob 的扩展)上,但两者都没有帮助。

我还在作业启动器的 jobParameters 中附加了一个时间戳,因此每个作业都有唯一的参数。这仍然不能解决它。作业名称始终相同。

有什么我想念的吗?

    <bean id="simpleJob" class="CustomJob" abstract="true">
            <property name="jobRepository" ref="jobRepository"/>
            <property name="restartable" value="false"/>
        </bean>
<bean id="simpleStep" class="org.springframework.batch.core.step.item.SimpleStepFactoryBean" abstract="true">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="jobRepository" ref="jobRepository"/>
    <property name="startLimit" value="100"/>
    <property name="commitInterval" value="1"/>
</bean>

<batch:job id="myJob" parent="simpleJob">
        <batch:step id="Step1" next="step2" parent="simpleStep">
            <batch:tasklet>
                <batch:chunk>
                    <batch:reader>
                        <bean class="myReader">
                            <property name="userName" value="***"/>
                            <property name="password" value="***"/>
                            <property name="url" value="***"/>
                        </bean>
                    </batch:reader>
                    <batch:writer>
                        <bean class="MyWriter">
                            <property name="dataSource" ref="dataSource"/>
                            <property name="updateOnKeyConflict" value="false"/>
                            <property name="table" value="myTable"/>
                        </bean>
                    </batch:writer>
                </batch:chunk>
            </batch:tasklet>
        </batch:step>
        <batch:step id="step2" next="step3" parent="simpleStep">
            <batch:tasklet>
                <bean class="queryTasklet">
                    <property name="dataSource" ref="dataSource"/>
                    <property name="sql" value="***"/>
                </bean>
            </batch:tasklet>
        </batch:step>
        <batch:step id="step3" parent="simpleStep">
            <batch:tasklet>
                <batch:chunk>
                    <batch:reader>
                        <bean class="mySeriesReader">
                            <property name="userName" value="***"/>
                            <property name="password" value="***"/>
                            <property name="url" value="***"/>
                        </bean>
                    </batch:reader>
                    <batch:writer>
                        <bean class="mySeriesWriter">
                            <property name="timeSeriesDAO" ref="timeSeriesDAO"/>
                            <property name="updateOnKeyConflict" value="false"/>
                        </bean>
                    </batch:writer>
                </batch:chunk>
            </batch:tasklet>
        </batch:step>
    </batch:job>
4

1 回答 1

2

做更多的研究,将属性 scope="step" 添加到我的阅读器类 bean 纠正了这个问题。您可以参考文档的第 5 章并阅读有关后期绑定的信息。

于 2012-06-18T18:38:10.177 回答