我在Spring中设置了几个线性步骤。如果在任何一点上,一个步骤失败了,作业应该失败。
这些步骤包括多个微线程,然后是一个基于块的步骤。即。:
如果出现问题,最明显的做法就是抛出异常。Spring Batch将处理此问题并记录所有内容。这种行为,尤其是打印堆栈跟踪,是不可取的,如果作业可以优雅地结束,并将状态设置为FAILED
。
Tasklet当前直接在Step贡献
上设置Exitstatus
。它们也是使用流构建的(这并不理想,但步骤可以不受阻碍地继续进行)。然后可以直接在Tasklet中处理这些问题。
然而,在基于块的方法中,我们无法访问步骤贡献
。我们只有步执行
。使用setExitStatus
在这里什么都不做。
我们使用的是构建器(JobBuilerFactory
和StepBuilderFactory
),而不是XML设置。
@AfterStep
时已经捕获了异常
步骤贡献设置一个替代值)
在我的例子中,我最终添加了条件,并在读卡器和处理器中抛出了JobInterruptedException
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobInterruptedException;
public class CustomReader implements ItemReader<String> {
@Override
public String read() throws Exception {
// ...
// if ("condition to stop job") {
throw new JobInterruptedException("Aborting Job", BatchStatus.ABANDONED);
// }
}
}
我认为你可以探索以下两个选项。
选项1:您可以使用noSkip
异常。
这会显式地防止跳过某些异常(和子类),并引发您希望作业失败的特定异常。
这就是如何配置帽子
stepBuilderFactory.get("myStep")
.<POJO, POJO> chunk(1000)
.reader(reader)
.processor(processor)
.writer(writer)
.faultTolerant()
.noSkip(YourCustomException.class)
.skip(Exception.class)
.skipLimit(100)
****选项2**:**您可以在步骤完成后将退出状态设置为FAILED以获取错误流
public class MyStepExecutionListener implements StepExecutionListener {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if(allIsGood()) //
{
return ExitStatus.COMPLETED;
}
else if (someExceptionOrErrorCase()){
return ExitStatus.FAILED;
}
}
}
希望这能有所帮助
据我所知,停止作业的唯一方法是抛出异常。没有其他优雅的方式告诉Spring Batch“这项工作完成了,它失败了,直接转到失败,不要通过GO等。”
虽然不是原始问题的直接解决方案,但可以使用。exceptionHandler()
是一个StepBuilder的
,可以更好地控制抛出的异常,例如记录它们。
public class LogAndRethrowExceptionHandler implements ExceptionHandler {
private static final Logger LOGGER = Logger.getLogger(...);
@Override
public void handleException(RepeatContext repeatContext, Throwable throwable) throws Throwable {
LOGGER.error(throwable.getMessage());
throw throwable;
}
}
理论上,通过这种方式,您可以隐藏Spring Batch生成的堆栈跟踪,但仍然显示错误消息。
我第一次使用Spring batch,我需要一些关于验证步骤的帮助。 在真正开始我的批处理作业之前,我需要对要处理的文件进行一些验证,例如: 使用数据库中的信息检查名称 使用来自系统和数据库的信息检查第一行和最后一行(特定) 用第一行中的数据检查总行号 在那之后,我真的可以开始我的批处理工作了。 我认为有多个步骤相互链接,第一步进行验证,如果文件无效,则进入错误步骤。 我如何进行验证?所有找到的阅
我有一个spring批处理作业,它接收平面文件,处理记录,并将输出写入另一个平面文件。我分别使用了和作为读写器。然而,当我尝试实现多线程步骤时,我的工作无法正常工作。我在日志文件中收到以下警告 你能帮我实现多线程步骤吗?
我正在尝试在Spring批处理中并行运行多个作业。在谷歌上搜索了很多之后,我遇到了JobStep。有没有人使用过JobStep可以解释如何使用它来并行运行作业,或者有没有其他方法可以并行运行2个独立的作业,即当我启动批处理时,2个作业应该开始并行运行。我的要求就像 当我的应用程序启动时,两个作业都应该开始运行。使用spring batch是否可以这样做 编辑:我甚至试过这种方法 我面临着例外。sp
你可以点击 “设置任务计划”来为一个批处理作业设置计划和点击 “删除任务计划”来移除计划。 如果你在“常规”选项卡选择“不管用户是否登录都要运行”,当你保存计划时你必须在 Windows 计划程序提供你的操作系统用户密码。 【注意】请在设置计划之前保存批处理作业。在运行计划之前,在连接窗口内的密码必须保存。
添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以双击或拖放工作来将工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除工作,请以相同的方式移除它们。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可使用 “上移”或 “下移”按钮。 如果你想备份整个服务器,
你可以点击 来为一个批处理作业设置计划和点击 来移除计划。 “小时”和“分钟”字段必需指定。如果字段没有任何值,将会使用全部值。例如,如果“星期”字段是空的,系统会视为这个字段被输入“0, 1, 2, 3, 4, 5, 6”。使用逗号以分隔值。例如,0, 1, 3, 6。使用连字号 (-),不含空格以指示值。例如,0-4。 例子:批处理作业将会在每个工作日下午 6:30 运行。 【注意】请在设置计