我定义了一个块,提交间隔为10,跳过限制为10。处理器类通过应用一些算术运算来操作字段。其中一条记录(比如第6条记录)在处理器类中发生异常。在此之后,再次处理1到5条记录,跳过第6条记录,处理7到10条记录,并将其写入XML(自定义XML编写器类)。由于处理器处理1-5条记录两次,因此预期字段值计算两次是错误的。您能否建议一种解决方案,让处理器只处理一次记录,只跳过失败的记录,并将处理后的记录写入XML?
用onSkipInProcess()、onSkipInRead()、onSkipInWrite()实现了一个SkipListener。但产出仍然是一样的。
jobconfig.xml
<batch:job id="job">
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="itemReader" writer="itemWriter"
processor="itemProcessor" commit-interval="10" skip-limit="5" retry-limit="0" >
<batch:skippable-exception-classes>
<batch:include class="java.lang.Exception"/>
</batch:skippable-exception-classes>
<batch:listeners>
<batch:listener ref="skipListener" />
</batch:listeners>
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="itemWriter" class="a.b.XWriter" scope="step"/>
<bean id="skipListener" class="a.b.SkipListener"/>
<bean id="itemProcessor" class="a.b.XProcessor" scope="step"/>
<bean id="itemReader" class="a.b.XReader"/>
ItemReader类:
public class XReader implements ItemReader {
@Autowired
private XRepository classDao;
private List lst = new ArrayList();
private int index= 0;
public Object read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if (lst.isEmpty()) {
lst = classDao.findAll();
}
if (index < lst.size()) {
return lst.get(index++);
} else return null;
}
}
ItemProcessor类:
public class XProcessor<T> implements ItemProcessor<T, T> {
public Object process(Object item) throws Exception {
// logic here
}
ItemWriter类:
public class XWriter <T> implements ItemWriter<T> {
public void write(List<? extends T> items) throws Exception {
// logic here to write to XML
}}
SkipListener课程:
public class SkipListener<T,S> implements org.springframework.batch.core.SkipListener<T, S> {
public void onSkipInProcess(T arg0, Throwable arg1) {
}
public void onSkipInRead(Throwable arg0) {
}
public void onSkipInWrite(S arg0, Throwable arg1) {
}
}
您需要有一个像下面这样的侦听器实现。每当发生一些异常时,它都会调用相应的方法,如果您愿意,您可以处理,否则只需将方法留空。这样它就不会失败。
它也不会调用处理器两次。
xml配置:
<batch:listeners>
<batch:listener ref="recordSkipListener"/>
</batch:listeners>
侦听器类:
public class RecordSkipListener implements SkipListener<Model> {
@Override
public void onSkipInRead(Throwable t) {
}
@Override
public void onSkipInWrite(Model item, Throwable t) {
}
@Override
public void onSkipInProcess(Model item, Throwable t) {
}
}
当在容错步骤中使用Item处理机
时,它们应该是幂等的,因为它们有被多次调用的风险(如您的示例中所示)。您可以在留档的第6.3.3节中阅读更多信息:http://docs.spring.io/spring-batch/reference/html/readersAndWriters.html
关于skip,我有一个非常基本的问题。我正在使用spring示例提供的spring batch simple cli项目,并试图理解跳过行为。它有一个非常基本的示例读取器,可以读取字符串数组(我将其修改为从Hellowworld 1到Hellowworld 10的10个字符串列表中读取),还有一个基本的编写器,可以登录到控制台。writer抛出java。每写一次都有例外。我在作业配置中增加了4个跳
假设我有一个像这样配置的简单任务: 当抛出MyRetryableException时,我重试了15次,但最后我得到了
我有一个自定义跳过管理步骤。我定义了一个跳过策略,其源代码如下: 我的Skip侦听器如下: 我的步骤定义如下: 我想跳过一个约束冲突异常。但是,不会调用侦听器或跳过策略。
我有一个工作,处理项目的大块(1000个)。这些项目被封送到一个JSON有效负载中,并作为一个批处理发布到远程服务(在一个HTTP POST中所有1000个)。有时远程服务陷入困境,连接超时。我为此设置了跳过 如果一个块失败了,批处理重试这个块,但一次一个项目(为了找出是哪个项目导致了失败)但在我的情况下,没有一个项目导致了失败,这是整个块作为块成功或失败的情况,应该作为块重试(事实上,下降到单项
几乎我的所有批处理都有一个读取器(JpaPagingItemReader从我的数据库读取数据)、一个处理器和一个创建XML文件的写入器。这3个部分都在一个步骤,我的块大小通常在50左右。 当发生可跳过的异常时,我注意到了两个副作用,我想知道是否有一种方法可以改变这些默认行为=> 我通常在阅读器中读取JPA实体,并将它们发送到处理器,在那里我将更改它们的属性以更新数据库。但是,当发生可跳过的异常并且
我正在编写一个Spring批处理应用程序: null