Errors in reader/writer open/close methods are not handled
cn-src opened this issue · 4 comments
When java.lang.Error is thrown in the RecordReader open() method, the error information will be lost, and the toString() method of JobReport will generate a NullPointerException because getStartTime() is null.
Thank you for opening this issue. However, I don't understand how a NPE could happen as the start
method (where the startTime
is set) is called before the openReader
method.
I was not able to reproduce the issue, here is a quick example:
import org.jeasy.batch.core.job.Job;
import org.jeasy.batch.core.job.JobBuilder;
import org.jeasy.batch.core.job.JobReport;
import org.jeasy.batch.core.reader.RecordReader;
import org.jeasy.batch.core.record.Record;
import org.jeasy.batch.core.writer.StandardOutputRecordWriter;
public class Launcher {
public static void main(String[] args) {
Job job = new JobBuilder<String, String>()
.reader(new RecordReader<>() {
@Override
public Record<String> readRecord() {
return null;
}
@Override
public void open() {
throw new Error("boom");
}
})
.writer(new StandardOutputRecordWriter<>())
.build();
JobReport jobReport = job.call();
System.out.println(jobReport);
}
}
This example does not fail with a NPE. However, it crashes with:
[main] INFO org.jeasy.batch.core.job.BatchJob - Job 'job' starting
Exception in thread "main" java.lang.Error: boom
at org.jeasy.batch.tutorials.basic.helloworld.Launcher$1.open(Launcher.java:56)
at org.jeasy.batch.core.job.BatchJob.openReader(BatchJob.java:151)
at org.jeasy.batch.core.job.BatchJob.call(BatchJob.java:107)
at org.jeasy.batch.tutorials.basic.helloworld.Launcher.main(Launcher.java:61)
Is this what you mean by the error information will be lost
? Anyway, Easy Batch should not crash like this (currently it only catches exceptions but not errors when opening/closing the reader/writer), it should catch errors and stops gracefully, so I consider this as a bug.
I pushed a fix (see 2c0b7ca) and the previous example now fails gracefully like follows:
[main] INFO org.jeasy.batch.core.job.BatchJob - Job 'job' starting
[main] ERROR org.jeasy.batch.core.job.BatchJob - Unable to open record reader
java.lang.Error: boom
at org.jeasy.batch.tutorials.basic.helloworld.Launcher$1.open(Launcher.java:46)
at org.jeasy.batch.core.job.BatchJob.openReader(BatchJob.java:151)
at org.jeasy.batch.core.job.BatchJob.call(BatchJob.java:107)
at org.jeasy.batch.tutorials.basic.helloworld.Launcher.main(Launcher.java:51)
[main] INFO org.jeasy.batch.core.job.BatchJob - Job 'job' finished with status FAILED in 4ms
Job Report:
===========
Name: job
Status: FAILED
Parameters:
Batch size = 100
Error threshold = N/A
Jmx monitoring = false
Batch scanning = false
Metrics:
Start time = 2020-11-17T23:33:53.76051
End time = 2020-11-17T23:33:53.764532
Duration = 4ms
Read count = 0
Write count = 0
Filter count = 0
Error count = 0
Can you give it a try in v7.0.1-SNAPSHOT and share your feedback?
Yes, I can get normal error messages now. thank you!
@cn-src FYI, the fix for this issue has been released in v7.0.1.