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

如何跳过块中的任何错误并继续下一个块项?

尹雅健
2023-03-14

无论chunk是新的还是重复的用例1,没有这两项,如果在Writer中第二个事务失败,我希望回滚第一个事务,而不手动执行回滚和提交。因此,如果写抛出异常,它将自动回滚第一个事务。这很好。但我想要的是,即使有异常和事务回滚(对于那个块),我也希望以相同的方式、相同的行为继续下一个块,依此类推到最后一个块。

为了实现用例1,我想我必须将步骤配置为:

@Configuration
@EnableBatchProcessing
@EnableScheduling
@Slf4j
public class BatchConfiguration {

private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final MyItemReader myItemReader;
private final MyItemProcessor myItemProcessor;
private final MyItemWriter myItemWriter;

private final SimpleJobExecutionListener simpleJobExecutionListener;
private final MyChunkListener myChunkListener;

private final ApplicationContext applicationContext;
private final DataSource dataSource;





public BatchConfiguration(
        JobBuilderFactory jobBuilderFactory,
        StepBuilderFactory stepBuilderFactory,
        MyItemReader myItemReader,
        MyItemProcessor myItemProcessor,
        MyItemtWriter myItemWriter,
        SimpleJobExecutionListener simpleJobExecutionListener,
        MyChunkListener myChunkTransactionListener,
        DataSource dataSource,
        ApplicationContext applicationContext) {
    this.jobBuilderFactory = jobBuilderFactory;
    this.stepBuilderFactory = stepBuilderFactory;
    this.myItemReader = myItemReader;
    this.myItemProcessor = myItemProcessor;
    this.myItemWriter = myItemWriter;
    this.simpleJobExecutionListener = simpleJobExecutionListener;
    this.myChunkListener = myChunkListener;
    this.dataSource = dataSource;
    this.applicationContext = applicationContext;
}

@Bean
public Job registrationChunkJob() {
    return jobBuilderFactory.get("MyJob")
            .incrementer(new RunIdIncrementer())
            .listener(simpleJobExecutionListener)
            .flow(step()).end().build();
}

@Bean
TaskExecutor taskExecutorStepPush() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(2);
    taskExecutor.setMaxPoolSize(20);
    taskExecutor.setQueueCapacity(4);
    taskExecutor.setAllowCoreThreadTimeOut(true);
    taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
    taskExecutor.setThreadNamePrefix(LoggingUtil.getWeblogicName() + "-");
    return taskExecutor;
}

@Bean
public Step step() {
    DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
    attribute.setPropagationBehavior(Propagation.REQUIRED.value());
    attribute.setIsolationLevel(Isolation.READ_COMMITTED.value());

    return stepBuilderFactory.get("myStep").<MyObject, MyObject>chunk(5)
            .reader(myItemReader)
            .processor(myItemProcessor)
            .faultTolerant()
            .writer(myItemWriter)
            .listener(myChunkListener)
            .taskExecutor(taskExecutorStepPush())
            .throttleLimit(5)
            .transactionAttribute(attribute)
            .build();
}

我的工作没有安排。当当前工作完成时,我手动开始下一个工作,成功与否。正如我所说的,我不会从Writer中更改DB中的标志,所以如果它失败了,一些数据被跳过并且在DB(Writer)中没有更新,当作业完成后1h它将从DB中开始新的作业并尝试使用相同的(可能是新的)项目(Reader将选择它们,因为标记不会在处理时更新)。

我不想重复相同的块,如果它从作家失败。我只想重复块,如果它在处理器中失败(以获得一个好的)。另外,如果chunk失败,我不希望job停止,我希望job继续下一个chunk等等...如何做到这一点?

共有1个答案

许马鲁
2023-03-14

如何跳过块中的任何错误并继续下一个项目?

要做到这一点,您需要配置哪些异常会导致跳过项,正如配置跳过逻辑部分所解释的那样。

根据您的配置,您没有指定任何可跳过的异常。您的步骤定义应该类似于:

@Bean
public Step step() {
   DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
   attribute.setPropagationBehavior(Propagation.REQUIRED.value());
   attribute.setIsolationLevel(Isolation.READ_COMMITTED.value());

   return stepBuilderFactory.get("myStep").<MyObject, MyObject>chunk(5)
        .reader(myItemReader)
        .processor(myItemProcessor)
        .faultTolerant()
        // add skip configuration
        .skipLimit(10)
        .skip(MySkippableException.class)
        .writer(myItemWriter)
        .listener(myChunkListener)
        .taskExecutor(taskExecutorStepPush())
        .throttleLimit(5)
        .transactionAttribute(attribute)
        .build();
}
 类似资料:
  • 我有一个如下结构的场景: 如您所见,在第二个示例中有一个参数“被忽略”。如果我在运行时检测到这个关键字,我希望跳过出现关键字的步骤。 目前我使用这个: 如果存在IGNORED关键字,则此步骤将设置为PASSED。相反,我想要的是将这单个步骤标记为SKIPPED,并且仍然执行以下步骤,然后根据其他步骤的状态将完整的测试场景标记为PASSED或FAILED。 所以我的问题是: 有没有办法手动将 Cuc

  • 我正在写一个网页抓取程序,我面临着以下问题。当我的URL是*. doc或*. jpg等时,我的当前请求不会超时,也不会传递到下一个URL。 例如: 你能帮我获取()url吗?但有些url需要10秒钟,然后转到下一个吗?? 我还尝试了eventled: 我收到了如下一系列错误: Traceback(最近一次调用): File"emailCrawler.py", line 69, in getLink

  • 因此,我正在开发一个程序,允许用户将学生添加到班级中,并管理他们的成绩等等。当用户选择菜单中的第一个选项时,他必须输入一个id(必填),但他也可以添加数字分数和/或字母等级。根据另一篇文章中的反馈,我设法创建了一个字符串变量行来读取用户输入,然后检查它是否为“S”/“S”(跳过或不跳过),并相应地将值解析为double。现在基于这个问题,如果用户决定跳过添加分数,我如何跳过提示并继续下一个提示?我

  • 问题内容: 当我定义一个任务在多个远程服务器上运行时,如果该任务在一个服务器上运行并退出并出现错误,Fabric将停止并中止该任务。但我想让Fabric忽略该错误并在下一台服务器上运行该任务。我怎样才能做到这一点? 例如: 问题答案: 从文档: … Fabric默认为“快速失败”行为模式:如果发生任何错误,例如远程程序返回非零返回值或fabfile的Python代码遇到异常,则执行将立即停止。 这

  • 我有一个带有以下方法的TestNG类。 我想实现的是:Test2、Test3和Test 4依赖于Test1。所以只有当Test1通过时,我才需要继续。 Test5依赖于Test2、Test3和Test4。但是我可以跳过任何测试(即Test2、Test3或Test4),并且如果其他测试没有失败,我仍然希望继续执行Test5。 我怎样才能做到这一点。

  • 如下所示,我有3张表,即:表“Shops Fruits Data”,表(“Months”)和表(“Output”)。 我正在尝试将数据从“Shops Fruits data”表中复制到(“Output”)结构中,该数据基于从表中的月份(“months”)。我已经写了一段代码。然而,使用这段代码,我只能遍历第一行。我不明白,我怎样才能继续到下一排,直到最后一排。其次,我也不能将商店和水果的名称复制到