Код, которым я делюсь, был анонимизирован.
Привет, сообщество!
В моем проекте мы используем несколько пакетных заданий Spring, и это предупреждение появляется в нашем журнале каждый раз, когда мы запускаем приложение Spring.
ПРЕДУПРЕЖДЕНИЕ FaultTolerantStepBuilder: 501 асинхронный TaskExecutor обнаружен с помощью средства чтения ItemStream.
Я сузил конкретное задание, на которое жалуется StepBuilder, и он использует ThreadPoolTaskExecutor с RepositoryItemReader.
ItemReader расширяет одну из форм StreamReader, поэтому и выдается это исключение (я думаю). Мы используем отказоустойчивую версию StepBuilder.
Я попробовал реализовать собственный ItemReader, но это не сработало, поскольку он не был ThreadSafe. Кто-нибудь знает, что:
- Это предупреждение нанесло им вред? (Пока нам это не причинило вреда)
- Как написать потокобезопасное средство чтения элементов или как использовать синхронный исполнитель задач
Код: Выделить всё
@Configuration
@EnableBatchProcessing
@RequiredArgsConstructor
public class GenericBatchConfig {
public static final String GENERIC_JOB = "genericJob";
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final GenericRepository genericRepository;
private final ItemReader reader;
private final GenericWriter writer;
private final UpdateDimensionTablesTasklet taslket;
private final ThreadPoolTaskExecutor taskExecutor; // Async Executor
@Value("${example.schedule." + GENERIC_JOB + ": 59 59 23 31 12 ? 2099}")
private String cronExpression;
@Value("${example.application.genericJobChunkSize}")
private int chunkSize;
@StepScope
@Bean
public RepositoryItemReader reader() { // Not the custom reader, but how it was before i tried a custom reader which did not work
RepositoryItemReader repositoryItemReader = new RepositoryItemReader();
repositoryItemReader.setRepository(genericRepository);
repositoryItemReader.setMethodName("method");
repositoryItemReader.setSort(Collections.singletonMap("id", Sort.Direction.ASC));
repositoryItemReader.setPageSize(chunkSize);
return repositoryItemReader;
}
@Bean
public Trigger genericTrigger(@Qualifier("genericJobDetail") JobDetail genericJobDetail) {
return TriggerBuilder.newTrigger()
.forJob(genericJobDetail)
.withIdentity("genericTrigger")
.withDescription("description")
.withSchedule(cronSchedule(cronExpression))
.build();
}
@Bean
public JobDetail genericJobDetail() {
return JobDetailBuilder.newJob()
.withIdentity(GENERIC_JOB)
.withDescription("description")
.withJobName(GENERIC_JOB)
.build();
}
@Bean
public Job genericJob() {
return jobBuilderFactory
.get(GENERIC_JOB)
.start(step1())
.next(step2())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory
.get("taskletName")
.tasklet(tasklet)
.build();
}
private Step step2() {
return stepBuilderFactory
.get("stepName")
.chunk(chunkSize)
.faultTolerant() // Here is the faultTolerant Builder
.skipLimit(1000)
.skip(Exception.class)
.listener(new CustomSkipListener())
.reader(reader)
.writer(writer)
.taskExecutor(taskExecutor)
.build();
}
}
Spring Batch «Асинхронный TaskExecutor, обнаруженный с помощью средства чтения ItemStream».
Но настройка другая.
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/792 ... eam-reader
Мобильная версия