当前位置: 首页 > 知识库问答 >
问题:

Spring批处理:已忽略可重启属性

宗波涛
2023-03-14

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

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

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

我试着将restartable属性以及它的父属性(SimpleJob的一个扩展)放在作业上,但两者都没有帮助。

我还在作业启动器的jobParameter中添加了一个时间戳,因此每个作业都有唯一的参数。这也不能修复它。作业名称总是相同的。

我错过了什么吗?

    <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>

共有1个答案

乐正瑞
2023-03-14

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

 类似资料:
  • 问题内容: 我有责任将我们的代码从sqlite切换到postgres。我遇到麻烦的查询之一复制到下面。 当有重复的记录时,就会出现此问题。在此表中,两个值的组合必须唯一。我在其他地方使用了一些plpgsql函数来执行更新或插入操作,但是在这种情况下,我可以一次执行多个插入操作。我不确定如何为此编写存储的例程。感谢您提供的所有sql专家的所有帮助! 问题答案: 有 3个 挑战。 您的查询在表和之间没

  • 我有以下一个批处理的Spring配置。我在生产批处理中遇到过一个问题,当一个特定的用例抛出一个不可跳过的异常时。当我在集成测试中复制用例时,批处理行为仍然很奇怪。当我的batch.commit-interval属性大于1时,将触发重试机制,回滚未提交的块,并再次处理所有以前的记录。当batch-commit-interval设置为1时,一旦抛出不可跳过的异常,批处理就会失败。 我尝试了batch-

  • 我有一个spring批处理作业,从CSV文件读取并写入数据库。我想让它重新启动。例如,如果在读取文件或写入db时出现异常,导致作业失败,则应从失败的同一点/块重新开始,而不是从头开始读取整个文件。 我正在从一个endpoint触发作业启动器,并在我的控制器中配置了它。 目前,我正在通过控制器将参数(这是一个唯一的标识符/数字)传递给作业参数,以运行新的作业实例。如果作业失败,我将使用与GET请求中

  • 我有以下步骤在批处理工作。 当某个异常抛出时,我在parseStepSkipListener中捕捉他并登录数据库。 我期待以下行为: 作业已启动 执行前面的步骤 开始执行解析步骤 阅读项目 进程项 写 哦,异常。 捕获异常,登录数据库,转到下一个块(读取、处理、写入)。 作业已启动 执行前面的步骤 开始执行解析步骤 阅读项目 进程项 写 哦,异常。 进程项 写入项 哦,异常。 捕获异常,登录数据库

  • 关于Anylogic中的批处理过程,我有一个非常简短的问题。 我想打印出已经退出前一个批处理元素的代理的ID,它们是在一起批处理的。因此,它们位于不同的元素(准确地说是发布),我正在努力在批处理中找到它们的ID。我唯一的想法是先取消批处理,然后打印出ID。 有没有一种方法可以在不拆分的情况下做到这一点? 事先非常感谢。 亲切的问候

  • 为了辅助批处理系统的设计和实现、应该通过结构示意图和代码实例的形式为设计师和程序员提供基础的批处理程序构建模块和以及处理模式. 在设计批处理Job时,应该将业务逻辑分解成一系列的步骤,使每个步骤都可以利用以下的标准构建模块来实现: 转换程序(Conversion Applications): 由外部系统提供或需要写入到外部系统的各种类型的文件,我们都需要为其创建一个转换程序, 用来将所提供的事务记