Как получить доступ к JobParameters в Spring Batch ItemReader?

Я пытаюсь получить доступ к параметрам задания в ItemReader, как показано ниже, но при попытке передать некоторые значения невозможно или я получаю некоторые ошибки, например.

«Не удалось инициализировать средство чтения: невозможно определить имя коллекции по типу «org.bson.Document». Это собственный тип хранилища?»

или

«Ошибка при закрытии средства чтения элементов. Невозможно вызвать «org.springframework.data.util.CloseableIterator.close()», поскольку «this.cursor» имеет значение null»


Чтобы передать параметры задания в ItemReader, я использую StepExecution, как показано ниже, но поскольку конструктор CustomDataReader выполняется перед методом beforeStep, я получаю ошибку в строке setCollection(collectionName). Итак, как это исправить?

@Getter
@Setter
@StepScope
@Component
public class CustomDataReader extends MongoCursorItemReader<Document> {

    @Value("#{jobParameters['collectionName']}")
    private String collectionName;

    @BeforeStep
    public void beforeStep(final StepExecution stepExecution) {
        JobParameters jobParameters = 
stepExecution.getJobParameters();        
        setCollectionName(parameters.getParameter("collectionName")
            .getValue().toString());
    }

    // @Autowired
    public CustomDataReader(
            @Qualifier("mongoTemplate") MongoTemplate mongoTemplate
    ) {
        setName("customDataReader");
        setTargetType(Document.class);
        setTemplate(mongoTemplate);
        setCollection(collectionName);
        setBatchSize(DEFAULT_CHUNK_SIZE);
        setLimit(DEFAULT_LIMIT_SIZE);
        setQuery(query);
    }

}

Я ищу решение без использования этих параметров задания в BatchConfig и только изменяю эту программу чтения.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я исправил проблему, установив параметры в методе beforeStep, как показано ниже:

@StepScope
@Component
public class CustomDataReader extends MongoCursorItemReader<Document> {

    private String collectionName;

    @BeforeStep
    public void beforeStep(final StepExecution stepExecution) {
        JobParameters jobParameters = 
stepExecution.getJobParameters();        
        setCollection(jobParameters.getString("collectionName"));
    }

    @Autowired
    public CustomDataReader(
            @Qualifier("mongoTemplate") MongoTemplate mongoTemplate
    ) {
        setName("customDataReader");
        setTargetType(Document.class);
        setTemplate(mongoTemplate);
        setBatchSize(DEFAULT_CHUNK_SIZE);
        setLimit(DEFAULT_LIMIT_SIZE);
    }
}

Вам не нужен @StepScope

anicetkeric 12.08.2024 11:15

@anicetkeric Спасибо, но когда я пытаюсь без @StepScope, я получаю сообщение «Ошибка создания bean-компонента с именем 'customReader', определенным в файле [/<project-name>/build/classes/java/main/company/batch/reade‌​r/CustomDataReader .c‌​lass]: требуется запрос." ошибка.

Murat Yıldız 12.08.2024 11:25
Ответ принят как подходящий

@StepScope используется в любом @Bean, которому необходимо внедрить @Values ​​из контекста шага, и в любом bean-компоненте, которому необходимо разделить жизненный цикл с выполнением шага. https://docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/core/configuration/annotation/StepScope.html

Вот код без @StepScope и установки запроса по умолчанию.

@Component
public class CustomDataReader extends MongoCursorItemReader<Document> {

    @BeforeStep
    public void beforeStep(final StepExecution stepExecution) {
        JobParameters jobParameters = stepExecution.getJobParameters();
        setCollection(jobParameters.getString("collectionName"));
    }

    public CustomDataReader(@Autowired MongoTemplate mongoTemplate) {

        setName("reader");
        setTargetType(Document.class);
        setTemplate(mongoTemplate);
        setBatchSize(DEFAULT_CHUNK_SIZE);
        setLimit(DEFAULT_LIMIT_SIZE);
        setSort(new HashMap<>());
        setQuery(new Query());
    }

}

Добавление setQuery(new Query()); сработало, большое спасибо.

Murat Yıldız 12.08.2024 13:17

Другие вопросы по теме