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

Spring批处理步骤不执行

钱振
2023-03-14

我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。

问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本:

<batch:job id="job.download-stuff" restartable="true">
<batch:validator ref="downloadValidator"/>
<batch:step id="job.download-stuff.download">
    <batch:tasklet ref="salesChannelOrderDownloader" transaction-manager="transactionManager">
        <batch:transaction-attributes isolation="READ_UNCOMMITTED" propagation="NOT_SUPPORTED"/>
        <batch:listeners>
            <batch:listener ref="downloadListener"/>
            <batch:listener ref="loggingContextStepListener" />
        </batch:listeners>
    </batch:tasklet>
    <batch:next on="CONTINUE" to="job.download-stuff.process-stuff.step" />
    <batch:end on="*" />
</batch:step>
<batch:step id="job.download-stuff.process-stuff.step">
    ...
</batch:step>
<batch:listeners>
    <batch:listener ref="loggingContextJobListener"/>
</batch:listeners>

委婉地说,我是Spring Batch的新手,所以如果我遗漏了重要的细节,请原谅我。我已经设置了断点,并打开了日志记录,以了解我能做什么。

到目前为止,我在数据库中观察到的是,条目似乎不再写入BATCH_STEP_EXECUTION和BATCH_JOB_EXECUTION表。

对于未处于完成状态的作业,没有BATCH_JOB_EXECUTION条目,也没有BATCH_STEP_EXECUTION条目未处于完成状态

我仔细查看了作为批处理添加downloadlistener:listener。以下是AfterStep的源代码:

@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public ExitStatus afterStep(StepExecution stepExecution) {
    long runSeconds = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - nanoStart);

    // If Success - we're good
    if (stepExecution.getStatus() == BatchStatus.COMPLETED) {
        Long endTs = stepExecution.getExecutionContext().getLong("toTime");
        Date toTime = new Date(endTs);
        handleSuccess(toTime, stepExecution.getWriteCount());
        return null;
    }

    // Otherwise - record errors
    List<Throwable> failures = stepExecution.getFailureExceptions();
    handleError(failures);
    return ExitStatus.FAILED;
}

我确认了返回exitstatus.failed行的html" target="_blank">执行,并且引发的异常被记录在FailureExceptions中。似乎一旦发生这种情况,BATCH_JOB_EXECUTION条目就处于完成状态(和exit_code),而STEP_EXECUTION失败。

此时,BATCH_JOB_EXECUTION_PARAMS表中的条目仍然保留。我实际上尝试修改它们的KEY_NAME和value列的值,但这仍然不允许作业运行。只要有绑定到JOB_EXECUTION_ID的参数,属于相同BATCH_JOB_INSTANCE的另一个作业就不能运行。

共有1个答案

艾焕
2023-03-14

JobParametersValidator,在您的示例中是DownloadValidatorbean在作业开始之前运行。

在您的情况下,传递作业的参数与“blobed up”JobInstance相同。然而,由于这项工作以戏剧性的方式失败,它可能没有被置于失败的状态。

您可以使用不同的参数运行作业(以获得新的作业实例),也可以尝试在重新启动之前将前一个步骤/作业的状态更新为BATCH_STEP_EXECUTION或BATCH_JOB_EXECUTION失败。

<batch:next on="CONTINUE" to="job.download-stuff.process-stuff.step" />
<batch:end on="*" />

首先,要非常小心地以*结尾。在您的方案中,它导致您完成作业(以“成功”),因为exitcodefailed。此外,成功步骤的默认exitcodecompleted,而不是continue,所以要小心。

<!-- nothing to me indicates you'd get CONTINUE here, so I changed it -->
<batch:next on="COMPLETED" to="job.download-stuff.process-stuff.step" />

<!-- if you ever have reason to stop here -->
<batch:end on="END" /> 

<!-- always fail on anything unexpected -->
<batch:fail on="*" />
 类似资料:
  • 我对spring batch基本上是新手。第一步,我从SFTP服务器获取一个文件,并使用JSch将其传输到本地目录。第二步,我读取本地目录中的文件,并将内容写入数据库。问题在于,在某些情况下,只执行saveDruchAltransaction(步骤2),而不执行getRemoteFile(步骤1) 配置类: 读者: 作家: 微线程: 我不知道该怎么做...我一直在尝试我从各地找到的东西。请帮忙谢谢

  • 我正在做一个项目,我将使用Spring批处理和Spring集成来创建工作流系统。这个工作流系统应该能够从队列中读取消息,这实际上是来自客户端的作业请求,根据作业请求类型,我需要调用一些7-8系统。 每个系统从某个位置读取输入文件(通常是一个集中存储系统,其中所有输入文件都存储在客户提交的文件中),对其进行处理,然后将其传递给下一个系统,最终我应该能够响应客户端,例如SUCCESS如果它被所有系统成

  • 我正在做一个包括Spring批处理的项目,在复制代码片段之前,我要简单地总结一下这项工作是如何使用cron的。 cron在我的项目上调用restapi(@PostMapping(“/jobs/external/{jobName}”) 在post方法中,我获取作业并执行它 在每次执行中,我都应该执行一个步骤 该步骤包含一个读卡器(对弹性API的外部rest调用以获取文档)和一个处理器 现在我的问题是

  • 使用Spring Batch 3.0.4.Release。 我将作业配置为使用分区步骤。从机步骤使用块大小1。任务执行器中有六个线程。我使用从六到数百的各种网格大小来运行这个测试。我的网格大小是从StepExecutions的数量,我希望==我的分区器创建的ExecutionContexts的数量。 下面是Java配置代码:

  • 我有一个Spring批处理作业。它的阅读器通过一些复杂的sql从数据库中读取一些记录。现在,对于我从数据库收到的每一条记录,我必须再打一个表来获取一些属性。注意:-我不能在阅读器步骤中加入这个表sql。所以这些获取的属性以及现有记录中的数据需要写入文件。这可以用Spring批处理完成吗?

  • 我正在寻找一些关于测试Spring批处理步骤和步骤执行的一般性意见和建议。 我的基本步骤是从api读入数据,处理实体对象,然后写入数据库。我已经测试了快乐之路,这一步成功地完成了。我现在想做的是在处理器阶段数据丢失时测试异常处理。我可以单独测试processor类,但我更愿意测试整个步骤,以确保在步骤/作业级别正确反映流程故障。 我已经阅读了spring批量测试指南,如果我是诚实的,我对它有点迷茫