Так как «Только методы удаления пустоты могут быть аннотированы с помощью @Scheduled
», как я могу использовать задачу Spring Batch и Spring Scheduler Task, когда я использую конфигурацию @Bean
вместо конфигурации xml? Ниже вы можете найти мой полный файл конфигурации. Он работает отлично, когда я запускаю от main()
, но только один раз. Я хочу добавить @Scheduled(fixedrate=9999)
, чтобы вызвать ту же работу на определенной частоте. Насколько я могу судить, для этого я должен был добавить @Scheduled
вокруг метода step1, но я не могу, поскольку он возвращает отличные от void.Как использовать @Configuration и @EnableScheduling вместе с Spring Spring
@Configuration
@EnableBatchProcessing
@EnableScheduling
public class BatchConfiguration {
private static final Logger log = LoggerFactory
.getLogger(BatchConfiguration.class);
@Bean
@StepScope
public FlatFileItemReader<Person> reader() {
log.info(new Date().toString());
FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
reader.setResource(new ClassPathResource("test_person_json.js"));
reader.setLineMapper(new DefaultLineMapper<Person>() {
{
setLineTokenizer(new DelimitedLineTokenizer() {
{
setNames(new String[] {"firstName", "lastName" });
}
});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {
{
setTargetType(Person.class);
}
});
}
});
return reader;
}
@Bean
public ItemProcessor<Person, Person> processor() {
return new PersonItemProcessor();
}
@Bean
public ItemWriter<Person> writer(DataSource dataSource) {
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
return writer;
}
@Bean
public Job importUserJob(JobBuilderFactory jobs, Step s1,
JobExecutionListener listener) {
return jobs.get("importUserJob").incrementer(new RunIdIncrementer())
.listener(listener).flow(s1).end().build();
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
ItemReader<Person> reader, ItemWriter<Person> writer,
ItemProcessor<Person, Person> processor) {
return stepBuilderFactory.get("step1").<Person, Person> chunk(10)
.reader(reader).processor(processor).writer(writer).build();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
//Question updated on Dec 3th 2015 with first suggestion
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class PersonScheduler {
private Job myImportJob;
private JobLauncher jobLauncher;
@Autowired
public PersonScheduler(JobLauncher jobLauncher, @Qualifier("myImportJob") Job myImportJob){
this.myImportJob = myImportJob;
this.jobLauncher = jobLauncher;
}
@Scheduled(fixedRate=9999)
public void runJob{
jobLauncher.run(myImportJob, new JobParameters());
}
}
Я получаю два предупреждения: 1 - (справа на @Scheduled) аннотацию @Scheduled запрещенная для этого места 2 - (справа по методе runJob) Множественные маркеры на этой линии - Синтаксическая ошибка, вставить «;» для заполнения FieldDeclaration - void является недопустимым типом для переменной runJob Я обновил свой вопрос, добавив ваше предложение. Я показал импорт, а также обычно такие предупреждения появляются, когда у нас нет правильного импорта, но я думаю, что я прав. Должен ли я добавить @SuppressWarnings? –
Я сковываю скобки для метода runJob(). Теперь он обновлен. – luboskrnac
Я вижу, что планировщик работает, но я получаю SimpleStepHandler: Шаг уже завершен или не перезапускается, поэтому никаких действий для выполнения: StepExecution: id = 1, version = 3, name = step1, status = COMPLETED, exitStatus = COMPLETED, readCount = 1, filterCount = 0, writeCount = 1 readSkipCount = 0, writeSkipCount = 0, processSkipCount = 0, commitCount = 1, rollbackCount = 0, exitDescription =. Мне кажется, что после того, как моя работа побежала дважды, ее больше нельзя побегать. Я предполагаю, что в первый раз выполняется, когда я запускаю приложение, а затем второй, когда запускает диспетчер. После этого статус «завершен» навсегда. –