2014-12-05 2 views
3

Я прочитал плоский файл (например. CSV-файл с 1 строкой на пользователя, например: UserId; Data1; Date2).Spring Batch, как фильтровать дублированные элементы перед отправкой в ​​ItemWriter

Но как обрабатывать дублированный элемент пользователя в считывающее (где нет списка previus пользователей ... прочитанные)

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

ответ

10

Фильтрация обычно осуществляется с 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; 

    } 
} 
+0

После выборки мои последние вопросы по StackOverflow, я нашел решение (что вы говорите): http://stackoverflow.com/a/26318180/1121571 Это лучшее решение (сохранить список в процессоре элементов), потому что список, который я передал в ItemWriter, так, где он хранится внутри? Как я могу получить к нему доступ правильно? – Aure77

+0

Это была бы обычная реализация 'ItemProcessor', поэтому вам решать, где хранить ранее просматриваемых пользователей. –

+0

Как сохранить последнюю запись? –

3

Как вы могли видеть здесь http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#faultTolerant

Когда кусок откатывается, элементы, которые были в кэше во время чтения может быть переработано. Если шаг сконфигурирован, чтобы быть терпимым ошибка (использование пропустить или повторить обработку обычно), любая ItemProcessor используется должна быть реализована таким образом, что идемпотентна

Это означает, что в примере Майкла, первый раз, когда пользователь Обработанные пользователя кэшируется в наборе, и если происходит сбой Написание детали, если шаг отказоустойчивость процессора будет выполняться снова для того же пользователя, и это Фильтр отфильтрует пользователь.

Улучшен код:

/** 
* 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; 
     } 
    } 
} 
Смежные вопросы