gpt4 book ai didi

java - 在步骤中实现 writer 时出现 Spring Batch : onWriteError in ItemWriteListener won't be reached on org. springframework.dao.DuplicateKeyException

转载 作者:行者123 更新时间:2023-12-01 18:13:15 25 4
gpt4 key购买 nike

我正在 try catch 由于唯一键冲突而无法插入数据库的项目。经过“无处不在”的研究后,令人沮丧的是,这开始让人感觉像是未修复的错误或其他什么东西。老实说,我需要一个有用的澄清。

编辑:已访问here跳过使用 @OnSkipInWrite 捕获的异常,这要么不够清晰,要么不起作用。

@Bean
public PersonFailureLoggerListener loggerListener() {
return new PersonFailureLoggerListener();
}

@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) throws MalformedURLException {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(10)
.reader(reader())
.faultTolerant().skipPolicy(fileVerificationSkipper())
.processor(itemProcessor())
.writer(writer)
//.listener(new PersonWriteListener())
.listener(loggerListener().asItemProcessListener())
.build();
}

项目监听器支持:

@Component
public class PersonFailureLoggerListener extends ItemListenerSupport<Person, Person> {

private static final Logger LOG = LoggerFactory.getLogger(Person.class.getSimpleName().concat(".error"));

@Override
public void afterProcess(Person i, Person o) {
LOG.info("before: {}, after: {}", i.toString(), o.toString());
}

@Override
public void onWriteError(Exception excptn, List<? extends Person> list) {
LOG.debug("list[{}] threw write exception", list.size(), excptn);
}

@Override
public void onReadError(Exception excptn) {
LOG.debug("encountered error on read", excptn);
}

public ItemProcessListener<Person, Person> asItemProcessListener() {
return this;
}
}

更新 PersonFailureLoggerListener:

@OnSkipInWrite
public void onSkipInWrite( Person skippedItem, Exception exception ){
LOG.debug("skipped person: {}", skippedItem.toString());
}

最佳答案

Edit: Visited here to have skipped exceptions captured using @OnSkipInWrite and this is either not clear enough or just wont work.

答案建议使用 SkipListener 但您要在此处注册 ItemProcessListener:

.listener(loggerListener().asItemProcessListener())

这是两个不同的监听器,在步骤生命周期的不同点调用。要监听跳过的项目,您应该注册一个 SkipListener:

class MySkipListener extends SkipListenerSupport {
@Override
public void onSkipInWrite(Object item, Throwable t) {
// TODO do something with skipped items
}
}

@Bean
public Step step() {
return stepBuilderFactory.get("step")
// .. step config
.listener(new MySkipListener())
.build();
}

关于java - 在步骤中实现 writer 时出现 Spring Batch : onWriteError in ItemWriteListener won't be reached on org. springframework.dao.DuplicateKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60422661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com