[SPRING] ItemWriter에 보내기 전에 중복 된 항목을 필터링하는 방법을 일괄 처리하는 방법
SPRINGItemWriter에 보내기 전에 중복 된 항목을 필터링하는 방법을 일괄 처리하는 방법
플랫 파일 (예 : 사용자 당 1 줄의 .csv 파일, 예 : UserId, Data1, Date2)을 읽었습니다.
하지만 리더에서 중복 된 사용자 항목을 처리하는 방법 (사용자가 읽은 사용자 목록이없는 경우 ...)
stepBuilderFactory.get("createUserStep1")
.<User, User>chunk(1000)
.reader(flatFileItemReader) // FlatFileItemReader
.writer(itemWriter) // For example JDBC Writer
.build();
해결법
-
==============================
1.필터링은 일반적으로 ItemProcessor를 사용하여 수행됩니다. ItemProcessor가 null을 반환하면 항목이 필터링되어 ItemWriter에 전달되지 않습니다. 그렇지 않으면 그렇습니다. 귀하의 경우, 이전에 본 사용자 목록을 ItemProcessor에 보관할 수 있습니다. 사용자가 이전에 본 적이 없다면 전달하십시오. 이전에 본 적이 있으면 null을 반환합니다. ItemProcessor를 사용한 필터링에 대한 자세한 내용은 다음 문서를 참조하십시오. http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#filiteringRecords
필터링은 일반적으로 ItemProcessor를 사용하여 수행됩니다. ItemProcessor가 null을 반환하면 항목이 필터링되어 ItemWriter에 전달되지 않습니다. 그렇지 않으면 그렇습니다. 귀하의 경우, 이전에 본 사용자 목록을 ItemProcessor에 보관할 수 있습니다. 사용자가 이전에 본 적이 없다면 전달하십시오. 이전에 본 적이 있으면 null을 반환합니다. ItemProcessor를 사용한 필터링에 대한 자세한 내용은 다음 문서를 참조하십시오. http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#filiteringRecords
/** * This implementation assumes that there is enough room in memory to store the duplicate * Users. Otherwise, you'd want to store them somewhere you can do a look-up on. */ public class UserFilterItemProcessor implements ItemProcessor<User, User> { // This assumes that User.equals() identifies the duplicates private Set<User> seenUsers = new HashSet<User>(); public User process(User user) { if(seenUsers.contains(user)) { return null; } seenUsers.add(user); return user; } }
-
==============================
2.여기에서 볼 수 있듯이 http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#faultTolerant
여기에서 볼 수 있듯이 http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#faultTolerant
즉, Michael의 예에서 사용자가 처음 처리 될 때 사용자가 Set에 캐시되고 실패한 경우 항목 작성, 단계가 내결함성이있는 경우 프로세서는 동일한 사용자에 대해 다시 실행되며이 필터 사용자를 걸러냅니다.
향상된 코드 :
/** * This implementation assumes that there is enough room in memory to store the duplicate * Users. Otherwise, you'd want to store them somewhere you can do a look-up on. */ public class UserFilterItemProcessor implements ItemProcessor<User, User> { // This assumes that User.equals() identifies the duplicates private Set<User> seenUsers = new HashSet<User>(); public User process(User user) { if(seenUsers.contains(user) && !user.hasBeenProcessed()) { return null; } else { seenUsers.add(user); user.setProcessed(true); return user; } } }
from https://stackoverflow.com/questions/27318466/spring-batch-how-to-filter-duplicated-items-before-send-it-to-itemwriter by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 보안 : REST 인증 테스트 및 이해 (0) | 2019.02.12 |
---|---|
[SPRING] 스프링 배치의 그리드 크기 (0) | 2019.02.12 |
[SPRING] Spring 프로필, 다른 Log4j2 구성 (0) | 2019.02.12 |
[SPRING] GET 리디렉션에서 SessionAttributes가 지워지는 이유는 무엇입니까? (0) | 2019.02.12 |
[SPRING] 항목 작성기없이 스프링 배치 단계를 작성하는 방법 (0) | 2019.02.11 |