복붙노트

[SPRING] ItemWriter에 보내기 전에 중복 된 항목을 필터링하는 방법을 일괄 처리하는 방법

SPRING

ItemWriter에 보내기 전에 중복 된 항목을 필터링하는 방법을 일괄 처리하는 방법

플랫 파일 (예 : 사용자 당 1 줄의 .csv 파일, 예 : UserId, Data1, Date2)을 읽었습니다.

하지만 리더에서 중복 된 사용자 항목을 처리하는 방법 (사용자가 읽은 사용자 목록이없는 경우 ...)

stepBuilderFactory.get("createUserStep1")
.<User, User>chunk(1000)
.reader(flatFileItemReader) // FlatFileItemReader
.writer(itemWriter) // For example JDBC Writer
.build();

해결법

  1. ==============================

    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. ==============================

    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;
            }
        }
    }
    
  3. 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