Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -70,7 +69,7 @@ public class EgovFlatFileByteReader<T> extends AbstractItemCountingItemStreamIte
private boolean strict = true;

public EgovFlatFileByteReader() {
setName(ClassUtils.getShortName(FlatFileItemReader.class));
setName(ClassUtils.getShortName(EgovFlatFileByteReader.class));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -71,4 +74,63 @@ public String mapLine(byte[] line, int lineNumber) {
}
}

@Test
void executionContextKeyMustNotCollideWithFlatFileItemReader() throws Exception {
// TaskletStep 은 Step 에 등록된 ItemStream 들을 CompositeItemStream 하나로 묶어
// 같은 ExecutionContext 에 재시작 상태를 저장한다.
// 표준 FlatFileItemReader 가 함께 등록된 Step 을 재현한다.
EgovFlatFileByteReader<String> byteReader = newByteReader();
FlatFileItemReader<String> 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<String> restartedByteReader = newByteReader();
FlatFileItemReader<String> 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<String> newByteReader() {
EgovFlatFileByteReader<String> reader = new EgovFlatFileByteReader<>();
reader.setResource(new ByteArrayResource(
"AAAAA\r\nBBBBB\r\nCCCCC\r\nDDDDD\r\n".getBytes(StandardCharsets.US_ASCII)));
reader.setLineMapper(new EgovByteLineMapper<String>() {
@Override
public String mapLine(byte[] line, int lineNumber) {
return new String(line, StandardCharsets.US_ASCII);
}
});
reader.setLength(5);
return reader;
}

private FlatFileItemReader<String> newFlatFileReader() {
FlatFileItemReader<String> reader = new FlatFileItemReader<>();
reader.setResource(new ByteArrayResource("1\n2\n3\n4\n".getBytes(StandardCharsets.US_ASCII)));
reader.setLineMapper(new PassThroughLineMapper());
return reader;
}

}