diff --git a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java index 263f4460..97f02f96 100755 --- a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java +++ b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReader.java @@ -18,7 +18,6 @@ import org.egovframe.rte.bat.core.item.file.mapping.EgovByteLineMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.NonTransientFlatFileException; import org.springframework.batch.item.file.ResourceAwareItemReaderItemStream; import org.springframework.batch.item.file.separator.RecordSeparatorPolicy; @@ -70,7 +69,7 @@ public class EgovFlatFileByteReader extends AbstractItemCountingItemStreamIte private boolean strict = true; public EgovFlatFileByteReader() { - setName(ClassUtils.getShortName(FlatFileItemReader.class)); + setName(ClassUtils.getShortName(EgovFlatFileByteReader.class)); } /** diff --git a/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java index 3cf6e300..1313766c 100644 --- a/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java +++ b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/EgovFlatFileByteReaderTest.java @@ -3,6 +3,9 @@ import org.egovframe.rte.bat.core.item.file.mapping.EgovByteLineMapper; import org.junit.jupiter.api.Test; import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.PassThroughLineMapper; +import org.springframework.batch.item.support.CompositeItemStream; import org.springframework.core.io.ByteArrayResource; import java.nio.charset.StandardCharsets; @@ -71,4 +74,63 @@ public String mapLine(byte[] line, int lineNumber) { } } + @Test + void executionContextKeyMustNotCollideWithFlatFileItemReader() throws Exception { + // TaskletStep 은 Step 에 등록된 ItemStream 들을 CompositeItemStream 하나로 묶어 + // 같은 ExecutionContext 에 재시작 상태를 저장한다. + // 표준 FlatFileItemReader 가 함께 등록된 Step 을 재현한다. + EgovFlatFileByteReader byteReader = newByteReader(); + FlatFileItemReader flatFileReader = newFlatFileReader(); + + CompositeItemStream stepStreams = new CompositeItemStream(); + stepStreams.register(flatFileReader); + stepStreams.register(byteReader); + + ExecutionContext executionContext = new ExecutionContext(); + stepStreams.open(executionContext); + flatFileReader.read(); + byteReader.read(); + byteReader.read(); + byteReader.read(); + stepStreams.update(executionContext); + stepStreams.close(); + + // 재시작: 저장된 ExecutionContext 로 두 reader 를 다시 연다. + EgovFlatFileByteReader restartedByteReader = newByteReader(); + FlatFileItemReader restartedFlatFileReader = newFlatFileReader(); + restartedByteReader.open(executionContext); + restartedFlatFileReader.open(executionContext); + try { + assertEquals("DDDDD\r\n", restartedByteReader.read(), + "3건을 처리했으므로 4번째 레코드부터 다시 읽어야 한다"); + assertEquals("2", restartedFlatFileReader.read(), + "표준 FlatFileItemReader 는 1건만 처리했으므로 2번째 라인부터 다시 읽어야 한다 " + + "— EgovFlatFileByteReader 가 같은 키를 쓰면 처리하지 않은 라인이 건너뛰어진다"); + } finally { + restartedByteReader.close(); + restartedFlatFileReader.close(); + } + } + + private EgovFlatFileByteReader newByteReader() { + EgovFlatFileByteReader reader = new EgovFlatFileByteReader<>(); + reader.setResource(new ByteArrayResource( + "AAAAA\r\nBBBBB\r\nCCCCC\r\nDDDDD\r\n".getBytes(StandardCharsets.US_ASCII))); + reader.setLineMapper(new EgovByteLineMapper() { + @Override + public String mapLine(byte[] line, int lineNumber) { + return new String(line, StandardCharsets.US_ASCII); + } + }); + reader.setLength(5); + return reader; + } + + private FlatFileItemReader newFlatFileReader() { + FlatFileItemReader reader = new FlatFileItemReader<>(); + reader.setResource(new ByteArrayResource("1\n2\n3\n4\n".getBytes(StandardCharsets.US_ASCII))); + reader.setLineMapper(new PassThroughLineMapper()); + return reader; + } + }