sop*_*hie 6 spring fault-tolerance spring-batch
我有以下步骤:
return stepBuilderFactory.get("billStep")
.allowStartIfComplete(true)
.chunk(20000)
.reader(billReader)
.processor(billProcessor)
.faultTolerant()
.skipLimit(Integer.MAX_VALUE)
.skip(BillSkipException.class)
.listener(billReaderListener)
.listener(billSkipListener)
.writer(billRepoItemWriter)
.build();
Run Code Online (Sandbox Code Playgroud)
我的理解是否正确,容错意味着当在 billProcessor 中引发异常时,它将在跳过侦听器中进行处理,然后下一行/项目将在 billProcessor 中进行处理?
我注意到在添加调试日志时 - 当处理器中抛出异常时,项目/行被“重新处理”。(可能是因为容错配置。但是,如果我正在处理 200 万条记录,其中 300,000 条记录被跳过 - 或者引发跳过异常 - 如果其中一些记录被“重新处理”,这不是性能问题吗)
最大的问题是 -下一行/项目被跳过。它们根本没有在处理器中进行处理。
如果我删除了faultTolerant和SkipListener - 并直接将跳过的记录保存在数据库中(skiplistener正在做什么) - 它正在工作,但是这个解决方案是否正确?
\n\n\n没有工作是完美的!错误发生。您可能会收到不良数据。您可能会忘记一项空检查,在最糟糕的情况下会导致 NullPointerException。如何使用 Spring Batch 处理错误是我们今天的主题。在很多情况下,处理过程中遇到的异常不应导致步骤失败,而应跳过。
\n弹簧批跳过技术\n使用跳过技术,您可以指定某些异常类型和跳过的项目的最大数量,并且每当抛出这些可跳过的异常之一时,批处理作业不会\xe2\x80\x99 失败,但会跳过该项目并继续继续下一篇。仅当达到最大跳过项目数时,批处理作业才会失败。例如,当从输入读取记录时发生错误时,Spring Batch 提供了在引发指定异常时跳过记录的功能。本节将介绍如何使用此技术根据特定异常跳过记录。选择何时跳过记录涉及两部分。
\n1. 例外情况\n什么情况下要跳过记录,具体来说会忽略哪些异常。当读取过程中发生任何错误时,Spring Batch 会抛出异常。为了确定要跳过哪些内容,您需要确定要跳过哪些异常。
\n2. 跳过的记录\n在考虑步骤执行失败之前,您将允许该步骤跳过多少条输入记录。如果您跳过一百万条记录中的一两条,也没什么大不了的;然而,跳过一百万中的五十万可能是错误的。您有责任确定阈值。
\n
整个处理发生在每个单独的项目级别,而不是块级别。因此,每当我们春季批次无法一次性处理某个项目时。它尝试重新处理/深入挖掘各个项目以确定要跳过的确切项目。这很好,因为对于批处理作业,我们预计会有一定的延迟,因为它们通常处理预定的大数据作业。
\n| 归档时间: |
|
| 查看次数: |
16505 次 |
| 最近记录: |