Spring-Batch:如何在Spring Batch中使用skip方法捕获异常消息? [英] Spring-batch : How to catch exception message with skip method in spring batch?
问题描述
我是Spring Batch的新手. 我的问题是如何使用spring-batch中的skip方法捕获异常? 据我所知,当spring批处理中发生某些异常时,我们可以使用skip方法来跳过它们. 但是,如何使用skip方法获取异常消息? 有人建议我使用 SkipListener ,该类具有三个回调方法,如 onSkipInProcess(),但对我没有用. 而且ItemProcessListener也不起作用.
I am a novice of spring batch. My question is how to catch exceptions with the skip method in spring-batch? As I know, we can use a skip method to skip them when some exceptions happened in spring batch. But how can I get the exception message with skip method? somebody suggested me use SkipListener ,this class has three call back method like onSkipInProcess(),but it is no use for me. And ItemProcessListener did not work either.
如下所示的代码:(我使用skip方法忽略异常,并使用两个侦听器接收异常信息)
The code like below:(I use skip method to ignore the exception and two listeners to receive the exception info)
Step mainStep = stepBuilder.get("run")
.<ItemProcessing, ItemProcessing>chunk(5)
.faultTolerant()
.skip(IOException.class).skip(SocketTimeoutException.class)//skip IOException here
.skipLimit(2000)
.reader(reader)
.processor(processor)
.writer(writer)
.listener(stepExecListener)
.listener(new ItemProcessorListener()) //add process listener
.listener(new SkipExceptionListener()) //add skip exception listner
.build();
ItemProcessorListener如下:
ItemProcessorListener like below:
//(this class implements ItemProcessListener )
{
@Override
public void beforeProcess(Object item) {
// TODO Auto-generated method stub
}
@Override
public void afterProcess(Object item, Object result) {
logger.info("invoke remote finished, item={},result={}",item,result);
}
@Override
public void onProcessError(Object item, Exception e) {
logger.error("invoke remote error, item={},exception={},{}",item,e.getMessage(),e);
}
}
SkipExceptionListener如下所示:
SkipExceptionListener like below:
//(implements SkipListener<Object, Object>)
{
@Override
public void onSkipInRead(Throwable t) {
// TODO Auto-generated method stub
}
@Override
public void onSkipInWrite(Object item, Throwable t) {
// TODO Auto-generated method stub
}
@Override
public void onSkipInProcess(Object item, Throwable t) {
logger.info("invoke remote finished,item={},itemJsonStr={},errMsg={},e={}",
item,
JSONObject.toJSONString(item),
t.getMessage(),
t);
}
}
问题是所有记录器都无法正常工作.实际上,跳过方法效果很好,我可以在表batch_step_execution中获取跳过计数.我不确定这两个侦听器是否要回调.谁能告诉我该怎么办?还是还有别的?非常感谢.
The issue is that all logger did not work. Actually the skip method does work well, I can get the skip count in table batch_step_execution. I am not sure these two listeners whether be callback. Who can tell me how can I do? Or is there anything else? Thanks a lot.
推荐答案
如何在Spring Batch中使用skip方法捕获异常消息?
How to catch exception message with skip method in spring batch?
您可以通过实现SkipListener
接口或扩展SkipListenerSupport
类来实现. SkipListener
界面中的所有方法都有一个Throwable
参数,该参数会引发异常,从而导致该项目被跳过.在这里您可以获取异常消息.这是一个示例:
You can do that by implementing the SkipListener
interface or extending the SkipListenerSupport
class. All methods in the SkipListener
interface have a Throwable
parameter which is the exception thrown and that caused the item to be skipped. This is where you can get the exception message. Here is an example:
import java.util.Arrays;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.SkipListener;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class MyJob {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
public ItemReader<Integer> itemReader() {
return new ListItemReader<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
}
@Bean
public ItemWriter<Integer> itemWriter() {
return items -> {
for (Integer item : items) {
System.out.println("item = " + item);
}
};
}
@Bean
public ItemProcessor<Integer, Integer> itemProcessor() {
return item -> {
if (item.equals(7)) {
throw new IllegalArgumentException("Sevens are not accepted!!");
}
return item;
};
}
@Bean
public Step step() {
return steps.get("step")
.<Integer, Integer>chunk(5)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.faultTolerant()
.skip(IllegalArgumentException.class)
.skipLimit(3)
.listener(new MySkipListener())
.build();
}
@Bean
public Job job() {
return jobs.get("job")
.start(step())
.build();
}
public static class MySkipListener implements SkipListener<Integer, Integer> {
@Override
public void onSkipInRead(Throwable t) {
}
@Override
public void onSkipInWrite(Integer item, Throwable t) {
}
@Override
public void onSkipInProcess(Integer item, Throwable t) {
System.out.println("Item " + item + " was skipped due to: " + t.getMessage());
}
}
public static void main(String[] args) throws Exception {
ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
JobLauncher jobLauncher = context.getBean(JobLauncher.class);
Job job = context.getBean(Job.class);
jobLauncher.run(job, new JobParameters());
}
}
在此示例中,MySkipListener
实现SkipListener
,并在尝试执行操作时从异常中获取消息.该示例读取从1到10的数字,并跳过数字7.您可以运行main
方法,并应看到以下输出:
In this example, MySkipListener
implements SkipListener
and gets the message from the exception as you are trying to do. The example reads numbers from 1 to 10 and skips number 7. You can run the main
method and should see the following output:
item = 1
item = 2
item = 3
item = 4
item = 5
item = 6
item = 8
item = 9
item = 10
Item 7 was skipped due to: Sevens are not accepted!!
我希望这会有所帮助.
这篇关于Spring-Batch:如何在Spring Batch中使用skip方法捕获异常消息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!