【问题标题】:Spring Batch: Restartable attribute ignoredSpring Batch:忽略可重启属性
【发布时间】:2012-06-18 14:08:47
【问题描述】:

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

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

这并没有解决问题。如果我写出“this.hashCode()”,每次调用 reader 类时都会得到相同的哈希 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>

【问题讨论】:

    标签: instance spring-batch job-scheduling


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-10-14
      • 2023-03-23
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2015-05-28
      相关资源
      最近更新 更多