Какова цель @JobScope в Spring Batch? Каков предполагаемый способ обмена данными в памяти между этапами? - PullRequest
1 голос
/ 11 марта 2020

Я использую его сегодня для кэширования объектов между этапами, чтобы мне не нужно было создавать всю работу за один шаг. Сначала, поскольку мои Шаги не были аннотированы какой-либо областью действия (хотя трудно понять, что они неявно означают @JobScope), я столкнулся с некоторыми грубыми проблемами модульного тестирования, утверждая:

Scope 'job 'не активен для текущего потока; рассмотрите возможность определения прокси-объекта с областью действия для этого компонента, если вы намереваетесь ссылаться на него из синглтона; Вложенное исключение: java .lang.IllegalStateException: нет доступного держателя контекста для области действия

Я прочитал (в оставленном потоке Gitter (который был очень информативным)), что это может быть неправильным использовать случай для @JobScope. На самом деле, я обеспокоен тем, что объем работ как-то зависит от потока.

Это приводит меня к вопросу о том, какова цель @JobScope, если я действительно неправильно ее использую? И если я неправильно его использую, каков правильный способ обмена данными между шагами в одном и том же задании без записи в таблицу / временный файл базы данных только для того, чтобы развернуться и прочитать ее в начале следующего шага?
Как примечание: (и Spring Batch ничем не отличается от других платформ в этом отношении) эти вопросы проистекают из имеющихся примеров, которые слишком просты c, чтобы иметь большое значение для реального использования.

1 Ответ

1 голос
/ 11 марта 2020

JobScope в 90% + случаев - это кодовый запах. Вот почему мы избегали добавлять его в течение стольких лет. На самом деле он был добавлен только в Spring Batch, поскольку эта функция требовалась для реализации JSR-352.

«Правильный» способ обмена данными между шагами - через какое-то правильное хранилище данных (некоторый тип БД, хранилище SQL, файлы и т. Д. c). Если ваша работа выйдет из строя, вы захотите, чтобы эти данные были доступны при перезапуске, при котором общий доступ к этим значениям в памяти через определенный кэш JobScope не будет включен. Если у вас есть большие объемы данных, вы бы хотели сохранить это где-то, чтобы экономно использовать вашу память. Кроме того, как вы заметили, JobScope (так же, как и StepScope) не доступен для всех потоков (поскольку мы не управляем всеми потоками в работе, практического способа сделать это не существует), поэтому это ограничивает его полезность.

В конце концов, мне еще предстоит найти вариант использования, в котором я сказал, что JobScope - это правильный способ обработки данного варианта использования, включая этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...