Я использую Spring Batch и использую аннотацию @Scheduler для планирования задания с определенной периодичностью.
Из сообщения об ошибке похоже, что Spring Boot ожидает по крайней мере записи, связанной с Spring DataSource, но мне это не нужно, потому что я сейчас не имею дело с БД.
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 1 of method batchConfigurer in org.springframework.boot.autoconfigure.batch.BatchConfigurerConfiguration$JdbcBatchConfiguration required a bean of type 'javax.sql.DataSource' that could not be found.
- Bean method 'dataSource' not loaded because @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'jndi-name'
- Bean method 'dataSource' not loaded because @ConditionalOnClass did not find required class 'javax.transaction.TransactionManager'
Action:
Consider revisiting the conditions above or defining a bean of type 'javax.sql.DataSource' in your configuration.
application.properties
cron.job.expression=*/1 * * * *
Другой класс:
@Configuration
@EnableBatchProcessing
@Primary
public class ScheduledDomainJob {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job scheduledJob() {
return jobBuilderFactory.get("scheduledJob").flow(step1()).end().build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<Domain, Domain>chunk(10)
.reader(reader()).writer(writer()).build();
}
@Bean
public FlatFileItemReader<Domain> reader() {
FlatFileItemReader<Domain> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("csv/domain-1-03-2017.csv"));
reader.setLineMapper(new DefaultLineMapper<Domain>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[]{"id", "domain"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Domain>() {{
setTargetType(Domain.class);
}});
}});
return reader;
}
@Bean
public CustomWriter writer() {
CustomWriter writer = new CustomWriter();
return writer;
}
@Bean
public RunScheduler scheduler() {
RunScheduler scheduler = new RunScheduler();
return scheduler;
}
}
CustomerWriter.java
@Slf4j
public class CustomWriter implements ItemWriter<Domain> {
@Override
public void write(List<? extends Domain> items) throws Exception {
log.info("writer ....... " + items.size());
for (Domain domain : items) {
log.info(domain + "\n");
}
}
}
Определите следующую аннотацию для своего класса инициализации Springboot.
@EnableAutoConfiguration (exclude = {DataSourceAutoConfiguration.class})
Если это не сработает, попробуйте добавить H2 или hsqldb в зависимости maven.
Надеюсь, вы используете версию 2 с весенней загрузкой. Вы можете внести некоторые изменения в код, как показано ниже.
@EnableBatchProcessing
@Primary
public class ScheduledDomainJob extends DefaultBatchConfigurer
Определите следующую аннотацию для вашего класса приложения с весенней загрузкой.
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
Вы можете найти более подробную информацию на Пример Spring Batch Hello world с использованием Spring загрузки
Правильно, спасибо. Я получаю еще одну ошибку, почему мы должны ее исключить?