Весенняя партия, регистрация Пропущенные записи / строки

1

Чтобы иметь возможность регистрировать все пропущенные записи/строки (из плоского файла), я связал Item (модель данных) с FieldSet.getValues() в реализации FieldSetMapper<T>.

Вот record моя модель данных.

public void loadRecord(FieldSet fieldSet){
    record.setFieldSet(fieldSet.getValues());
}

SB обеспечивает запись/строку для onSkipInRead в FlatFileParseException. Чтобы иметь то же самое для onSkipInWrite и onSkipInProcess, я придумал вышеупомянутое решение. Кроме того, record не сохраняет все поля из плоского файла, поэтому я не могу использовать каждую строку, используя только модель данных.

  1. Это хороший способ добиться этого?
  2. Есть ли другие способы сделать это?
  3. Является ли запись/строка, соответствующая элементу, сохраненной в любом контексте?

Спасибо за помощь !

  • 0
    1. нет, действительно плохое решение 2. прочитайте документацию по FieldSetMapper и скачайте пример руководства по запуску SB; все будет понятнее!
  • 0
    Я пытался просмотреть эти ссылки spring.io/guides/gs/batch-processing , spring.io/guides/gs/yarn-batch-processing , но не нашел ничего полезного
Показать ещё 1 комментарий
Теги:
spring
spring-batch
batch-processing

2 ответа

1
Лучший ответ

Теперь я лучше понимаю вашу проблему :)
Сохраните всю строку в своем доменном объекте, а не в FieldSet используя пользовательский LineMapper.
Из LineMapper javadoc:

Интерфейс для отображения строк (строк) для объектов домена, обычно используемых для сопоставления строк, считанных из файла, в объекты домена в каждой строке. Реализации этого интерфейса выполняют фактическую работу по разбору строки без необходимости иметь дело с тем, как была получена линия.

Поэтому с делегатом довольно легко решить вашу проблему:

class StoreLineLineMapper implements LineMapper<DomainObject> {
  private LineMapper<DomainObject> delegate;

  public DomainObject mapLine(java.lang.String line, int lineNumber) throws java.lang.Exception {
    DomainObject record = delegate.mapLine(line, lineNumber);
    record.setLineInfo(new LineInfo(line, lineNumber));
    return record;
  }
}
  • 0
    Мне также нужно заполнить некоторые другие поля record значениями из токенов разобранной строки. Следовательно, я предпочитаю свое решение по этому (на самом деле я не приманки здесь).
  • 0
    С моим решением вы создаете и заполняете все поля, которые хотите, используя делегированный lineMapper, хранящийся в свойстве StoreLineLineMapper.delegate; Пользовательский LineMapper используется только для хранения информации о линии
0

Полный код для этого варианта использования:

public class UserMapper implements FieldSetMapper<User> {
    @Override
    public User mapFieldSet(FieldSet fieldSet) throws BindException {
      User user = new User();
      String ped = fieldSet.readString("Position effective date");
      user.setId(fieldSet.readInt("User ID"));
      user.setFn(fieldSet.readString("First Name"));

      user.loadRecord(fieldSet); // store fieldSet for regenerating line in future
    return user;
  }
}

Это приведет к восстановлению строки из поля FieldSet (Delimiter - TAB):

class User{

 @Override
   public String toString() {
     return StringUtils.arrayToDelimitedString(fieldSet,
            DelimitedLineTokenizer.DELIMITER_TAB);
 }
}

Строки журнала в SkipListener:

class SkipListener {

  public static final Logger logger = LoggerFactory.getLogger(SkipListener.class);

  @OnSkipInWrite
  public void onSkipInWrite(Object item, Throwable t) {
    onSkip(item);
  }

  @OnSkipInRead
  public void onSkipInRead(Throwable t) {
    if (t instanceof FlatFileParseException) {
     FlatFileParseException ffpe = (FlatFileParseException) t;
     onSkip(ffpe.getInput());
    }
  }

  @OnSkipInProcess
  public void onSkipInProcess(Object item, Throwable t) {
    onSkip(item);
  }

  public void onSkip(Object item) {
    logger.info(item);
  }
}
  • 0
    это работает, конечно. Но вы связали свой доменный объект с классами SB, и это зло;) ваша просьба сохранить lineinfo, а не объект SB. Если вы абсолютно хотите сохранить объект FieldSet в домене, создайте новый класс UserWithFieldSet, содержащий один объект User и один объект FieldSet и FieldSet этапе процесса.
  • 0
    Я не FieldSet объекты FieldSet , loadRecord() делает fieldSet.getValues () и сохраняет возвращенную String[] .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню