Пакет Springboot - использование JdbcPagingItemReader, и задание зависает, когда нет данных для выбора

У меня проблема с тем, что выглядит как метод, использующий JdbcPagingItemReader, который зависает.

Все отлично работает, когда в средстве чтения есть информация для возврата, но когда нижеприведенный выбор работает, когда нет информации для возврата, все работает не так хорошо (т. Е. Задание зависает).

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

В приведенном ниже примере вы увидите, что выбор довольно прост, так как он читает из одной таблицы, присоединяется к другой и выбирает строки с определенным статусом и в заданном диапазоне дат.

Дополнительная информация, если это поможет...

Springboot версии 2.5.6 с использованием java 17 и MySql для базы данных.

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

Спасибо.


@Configuration
@EnableBatchProcessing
public class BuildOpenStatusConfigurationJob {

    @Autowired
    JobBuilderFactory jobBuilderFactory;

    @Autowired
    StepBuilderFactory stepBuilderFactory;

    @Autowired
    DataSource dataSource;
....

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(12);
        executor.setMaxPoolSize(16);
        executor.setQueueCapacity(12);
        executor.initialize();
        return executor;
    }

    @Bean
    public Step createStsActivity() {
        return this.stepBuilderFactory.get("createStsActivity")
                .<StsActivity, StsActivity>chunk(1000)
                .reader(stsActivityItemReader(null, null))
                .processor(stsActivityItemProcessor())
                .writer(stsActivityItemWriter())
                .taskExecutor(taskExecutorRows())
                .throttleLimit(16)
                .listener(statusStepExecutionListener())
                .build();
    }

    @Bean
    @StepScope
    public JdbcPagingItemReader<StsActivity> stsActivityItemReader(
            @Value("#{jobParameters['lowerDateThreshold']}") String lowerDateThreshold,
            @Value("#{jobParameters['upperDateThreshold']}") String upperDateThreshold) {

        JdbcPagingItemReader<StsActivity> pagingItemReader = new JdbcPagingItemReader<>();

        pagingItemReader.setDataSource(dataSource);
        pagingItemReader.setFetchSize(10000);
        pagingItemReader.setPageSize(10000);
        pagingItemReader.setRowMapper(new BeanPropertyRowMapper<>(StsActivity.class));

        MySqlPagingQueryProvider mySqlPagingQueryProvider = new MySqlPagingQueryProvider();

        mySqlPagingQueryProvider.setSelectClause(ta.statusId as statusId, tb.eventDate as maxEventDate, tb.id as maxEventId ");
        mySqlPagingQueryProvider.setFromClause("FROM TableA ta" 
                 + "join TableB tb on tb.statusId = ta.statusId");
        mySqlPagingQueryProvider.setWhereClause("WHERE tb.status = 'OPEN' "
                + "and (date(tb.eventDate) >= date('" + lowerDateThreshold + "') "
                + "and date(tb.eventDate) < date('" + upperDateThreshold + "'))");

        Map<String, Order> orderByKeys = new HashMap<>();
        orderByKeys.put("rbpai.statusId", Order.ASCENDING);
        mySqlPagingQueryProvider.setSortKeys(orderByKeys);

        pagingItemReader.setQueryProvider(mySqlPagingQueryProvider);
        
        return pagingItemReader;
    }

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это было исправлено в v4.3.4: https://github.com/spring-projects/spring-batch/issues/3898.

С Spring Boot 2.5.6 вы получаете Spring Batch v4.3.3, который не содержит исправления.

Если вы обновите загрузочную версию до версии Batch 4.3.4+, проблема должна быть устранена. В противном случае, вероятно, это регресс. В этом случае добавьте комментарий на Github с минимальный полный пример, который воспроизводит проблему, и мы повторно откроем ее для расследования. Спасибо заранее.

Отлично и спасибо. Я продолжу обновление и буду следить за Github, если проблема все еще существует для меня.

Thomas Grady 04.05.2022 13:08

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