Spring grupuje, jak odfiltrować zduplikowane elementy przed wysłaniem ich do ItemWriter


Czytam płaski plik (taki jak plik .csv z 1 wierszem na użytkownika, na przykład:

UserId; Data1;Date2

).
Ale jak sobie radzić ze zduplikowanym elementem niestandardowym w czytniku (gdzie nie ma listy wcześniej przeczytanych użytkowników ...)
stepBuilderFactory.get("createUserStep1").<User, User>chunk(1000).reader(flatFileItemReader)// FlatFileItemReader.writer(itemWriter)// For example JDBC Writer.build();

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Filtrowanie jest zwykle wykonywane za pomocą
ItemProcessor
. Jeśli
ItemProcessor
zwraca wartość null, element jest filtrowany i nie jest przekazywany do
ItemWriter
. W przeciwnym razie tak jest. W twoim przypadku możesz przechowywać listę wcześniej widzianych użytkowników w
ItemProcessor
. Jeśli użytkownik nie został wcześniej zauważony, przekaż go dalej. Jeśli widziano wcześniej, zwraca wartość null. Możesz przeczytać więcej o filtrowaniu za pomocą
ItemProcessor
w dokumentacji tutaj:

http://docs.spring.io/spring- batch/trunk/reference/html/readersAndWriters.html#filiteringRecords
http://docs.spring.io/spring-b ... cords
/**
* 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; }
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak widać tutaj

http://docs.spring.io/spring- batch/trunk/reference/html/readersAndWriters.html#faultTolerant
http://docs.spring.io/spring-b ... ntGdy blok jest przywracany, elementy, które zostały zapisane w pamięci podręcznej podczas odczytu, mogą zostać ponownie przetworzone. Jeśli krok jest skonfigurowany do przełączania awaryjnego (zwykle pomijanie lub ponawianie próby), każdy używany ItemProcessor musi być zaimplementowany w idempotentny sposób.

Oznacza to, że w przykładzie Michaela na początku

przetwarzanie

użytkownik Użytkownik jest buforowany w zestawie i jeśli wystąpi awaria

dokumentacja

element, to jeśli krok jest bezpieczny, to

procesor

zostanie wykonany ponownie dla tego samego użytkownika i to

filtr

przefiltruje użytkownika.
Ulepszony kod:
/**
* 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;
}
}
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się