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

跳过spring批处理中未调用的侦听器

卢勇
2023-03-14

我有一个自定义跳过管理步骤。我定义了一个跳过策略,其源代码如下:

public class CustomSkipPolicy implements SkipPolicy {

    @Override
    public boolean shouldSkip(Throwable throwable, int skipCount) throws SkipLimitExceededException {
            return true;
    }
}

我的Skip侦听器如下:

@Component
public class JoueurSkipListener implements SkipListener<Object, Object> {

    @Autowired
    private LogImportRejetRepository logImportRejetRepository;

    @Override
    public void onSkipInRead(Throwable throwable) {

        saveLogImportRejet(Optional.empty(), throwable);
    }

    @Override
    public void onSkipInWrite(Object deltaObject, Throwable throwable) {
        saveLogImportRejet(Optional.of(deltaObject), throwable);
    }

    @Override
    public void onSkipInProcess(Object deltaObject, Throwable throwable) {
        saveLogImportRejet(Optional.of(deltaObject), throwable);
    }



    private void saveLogImportRejet(Optional<Object> deltaObject, Throwable throwable){

        LogImportRejet logImportRejet = LogImportRejet.builder()
                .createTime(OffsetDateTime.now())
                .typeImport(TypeImportEnum.JOUEUR)
                .motifRejet(throwable.getLocalizedMessage())
                .ligne(deltaObject.isPresent() ? deltaObject.get().toString(): null)
                .build();
        logImportRejetRepository.save(logImportRejet);
    }

}

我的步骤定义如下:

@Bean
    public Step stepImportJoueur(@Qualifier("joueurReader") ItemReader<IJoueurFed> joueurReader, @Qualifier("joueurWriter") ItemWriter<Joueur> joueurWriter, @Qualifier("joueurProcessor") JoueurProcessor joueurProcessor,
                                 @Qualifier("joueurSkipListener")  SkipListener joueurSkipListener) {
        SimpleStepBuilder<IJoueurFed, Joueur> builder = stepBuilderFactory.get("stepImportJoueur")
                .<IJoueurFed, Joueur>chunk(chunkSize)
                .reader(joueurReader)
                .processor(joueurProcessor)
                .writer(joueurWriter)
                .faultTolerant()
                .retryLimit(retryLimit)
                .retry(ConnectTimeoutException.class)
                .retry(DeadlockLoserDataAccessException.class)
                .skipPolicy(new CustomSkipPolicy());
        return builder.listener(joueurSkipListener).build();
    }

我想跳过一个约束冲突异常。但是,不会调用侦听器或跳过策略。

共有1个答案

方琦
2023-03-14

我在数据库表中有一个唯一的约束,当试图写入数据库时会导致约束违反异常。虽然发生了异常,但步骤总是有状态完成。这就是为什么我的跳过监听器没有被调用。为了解决这个问题,我创建了一个自定义的编写器,在调用父级的写入方法后调用entityManager.flush()。这样做后,抛出异常,并调用我的跳过监听器。我已经在这个stackoverflow线程中发布了一个代码片段:使用JPA事务进行Spring批处理错误处理

 类似资料:
  • 我定义了一个块,提交间隔为10,跳过限制为10。处理器类通过应用一些算术运算来操作字段。其中一条记录(比如第6条记录)在处理器类中发生异常。在此之后,再次处理1到5条记录,跳过第6条记录,处理7到10条记录,并将其写入XML(自定义XML编写器类)。由于处理器处理1-5条记录两次,因此预期字段值计算两次是错误的。您能否建议一种解决方案,让处理器只处理一次记录,只跳过失败的记录,并将处理后的记录写入

  • 关于skip,我有一个非常基本的问题。我正在使用spring示例提供的spring batch simple cli项目,并试图理解跳过行为。它有一个非常基本的示例读取器,可以读取字符串数组(我将其修改为从Hellowworld 1到Hellowworld 10的10个字符串列表中读取),还有一个基本的编写器,可以登录到控制台。writer抛出java。每写一次都有例外。我在作业配置中增加了4个跳

  • 假设我有一个像这样配置的简单任务: 当抛出MyRetryableException时,我重试了15次,但最后我得到了

  • 我的FlatFileItemWriter回调有一个奇怪的问题。我有一个自定义ItemWriter实现FlatFileFolterCallback和FlatFileHeaderCallback。因此,我在我的FlatFileItemWriter中设置页眉和页脚回调如下: ItemWriter Bean FlatFileItemWriter Bean 步进豆 我的writeFooter、writeHe

  • 我有一个工作,处理项目的大块(1000个)。这些项目被封送到一个JSON有效负载中,并作为一个批处理发布到远程服务(在一个HTTP POST中所有1000个)。有时远程服务陷入困境,连接超时。我为此设置了跳过 如果一个块失败了,批处理重试这个块,但一次一个项目(为了找出是哪个项目导致了失败)但在我的情况下,没有一个项目导致了失败,这是整个块作为块成功或失败的情况,应该作为块重试(事实上,下降到单项

  • 我正在实现spring kafka批处理侦听器,它读取来自kafka主题的消息列表,并将数据发布到REST服务。我想了解在REST服务停止的情况下的偏移管理,不应该提交批处理的偏移,应该为下一次轮询处理消息。我已经阅读了spring kafka文档,但在理解侦听器错误处理程序和批量查找当前容器错误处理程序之间的区别时存在困惑。我使用的是spring-boot-2.0.0。M7及以下版本是我的代码。