2014-09-17 3 views
2

У меня есть весеннее пакетное задание, где ItemWriter отправляется в веб-службу. У меня есть файл ввода, который я должен преобразовать и отправить в веб-службу, у меня нет прямого доступа к базе данных.Как обрабатывать ответы об ошибках веб-службы в ItemWriter Spring Batch?

Вопрос: как я должен обрабатывать ответы об отказе от веб-службы? Например, если я обрабатываю запись, и я отправляю ее в веб-службу, но веб-служба отвечает: «Failure - не может найти этот идентификатор». Как мне записать, что эта запись не удалась (в бизнес-смысле) весной партия? Я надеялся выпустить исключение для пропуска, так что в Spring Batch Admin будет записываться пропущение записи, но я вижу, когда я бросаю ошибку из записи элемента, кусок автоматически откатывается назад. И затем, когда кусок является переработкой, записи снова отправляются в веб-службу.

Какова рекомендация по данному сценарию? Что-то вроде отправки плохой записи другому писателю, записывающему его в отдельном месте? Или есть способ записать его, как писать пропустить, не откидываясь назад? Я понимаю, что это может быть большая проблема архитектуры в нашем приложении, и я открыт для предложений.

спасибо!

ответ

2

При возникновении ошибки в ItemWriter в Spring Batch мы откатываем весь фрагмент, устанавливаем интервал фиксации на 1 для элементов в этом блоке и повторяем их один за другим, чтобы мы могли идентифицировать один элемент, который вызвала проблему (мы не знаем в первый раз, поскольку мы передаем список элементов методу записи). Хотя это хорошо работает для транзакций ItemWriter (и мы можем работать как плоские файлы), очевидно, что у него есть некоторые проблемы с опциями без транзакций. Другое дело, что вы можете отключить откат, но это действительно не ваша проблема. Дело не в том, что вы не можете отключить откат, это откат не делает ничего. Отключение отката по-прежнему будет повторять ранее успешно обработанные элементы. Это просто указывает, что все нормально писать их снова.

Не зная ваш полный вариант использования (а также объем), Есть несколько вариантов, которые приходят на ум:

  • Установить размер блока в 1 - Один из основных драйверов для отрывов пунктов это оптимизация, которую вы можете получить при записи. Загружается JDBC. Запись всех строк в файл в одном блоке. Однако вызов веб-службы не получает этого преимущества, если вы должны называть его один раз для каждого элемента. Хотя вы, очевидно, будете иметь более высокую нагрузку на хранилище данных хранилища заданий, если это не вызывает беспокойства, этот параметр позволит вам использовать обычную логику пропуска/повтора, которую Spring Batch предоставляет без повторной отправки ранее удаленных сообщений.
  • Соблюдайте исключение самостоятельно - Поскольку вы, очевидно, создали свою собственную реализацию ItemWriter, вы можете справиться с этим исключением самостоятельно. До тех пор, пока вы не выбросите его из писателя, Spring Batch ничего не сделает.
Смежные вопросы