У меня проблема с тем, что выглядит как метод, использующий 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;
}
Это было исправлено в 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, если проблема все еще существует для меня.