2017-02-07 6 views
1

Есть ли какая-либо документация на основе чистой аннотации для Spring? 90% документов, которые я видел, написаны для реализации xml.Как вы переопределяете заданный по умолчанию JobLauncher? Spring Batch Annotations

Я пытаюсь переопределить заданный по умолчанию JobLauncher, чтобы иметь возможность передавать JobParameters, но любая функция JobLauncher, которую я добавил к приведенному ниже коду, была проигнорирована, и вместо этого запускался SimpleJobLauncher по умолчанию.

Я хотел бы запустить 4 параллельных экземпляра одной и той же работы с 4 различными параметрами Job. Параметры должны указывать читателю, с которого следует читать.

Я могу передать значения для каталога, используя аннотацию @Value, но это только разрешает мне устанавливать значение по умолчанию, которое не будет меняться между прогонами.

Я не могу настроить задание, когда я создаю его («Мир» полностью игнорируется)

@EnableBatchProcessing 
@Configuration 
public class BatchConfiguration{ 
    private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class); 

    @Resource 
    public JobLauncher jobLauncher; 

    @Resource 
    public JobBuilderFactory jobBuilderFactory; 

    @Resource 
    public StepBuilderFactory stepBuilderFactory; 

    @Bean 
    @StepScope 
    ItemReader<Record> reader(@Value("") String directory) { 
     return new ExcelReader(directory); 
    } 

    @Bean 
    public ItemProcessor processor() { 
     return new ItemProcessor(); 
    } 

    @Bean 
    public JobCompletionNotificationListener listener(){ 
     return new JobCompletionNotificationListener(); 
    } 

    @Bean 
    public Writer writer() { 
     Writer writer = new Writer(); 
     return writer; 
    } 

    //Job Definition 
    @Bean 
    public Job job(JobCompletionNotificationListener listener) { 
     return jobBuilderFactory.get("job") 
       .listener(listener) 
       .flow(step1("World")) 
       .end() 
       .build(); 
    } 

    @Bean 
    public Step step1(String directory) { 
     return stepBuilderFactory.get("step1") 
       .<Record, Record> chunk(10) 
       .reader(reader(directory)) 
       .processor(processor()) 
       .writer(writer()) 
       .build(); 
    } 
} 

Я начинаю мое приложение с помощью

SpringApplication.run(Application.class, args); 

есть лучший способ запустить приложение?

ответ

0

Нет новостей о документации по аннотации, но я нашел ответ на параметры передачи. Поскольку мы не используем xml, мы можем использовать AnnotationConfigApplicationContext и указать верхний пакет. Затем мы используем этот контекст, чтобы получить запуск и запуск параметров по умолчанию при запуске заданий.

ApplicationContext context = new AnnotationConfigApplicationContext("package.names.*"); 
    JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
    Job job = (Job) context.getBean("testJob"); 


    Map<String, JobParameter> params = new HashMap<String, JobParameter>(); 
    JobExecution execution = null; 
    JobParameters jp = null; 
    try { 
     params.put("directory", new JobParameter("testfolder")); 
     jp = new JobParameters(params); 
     execution = jobLauncher.run(job, jp); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
0

Вы можете обновить TransactionManager боб, если вы хотите метаданные С.Б., чтобы быть сохранены (рекомендуется).

@Bean 
    public ResourcelessTransactionManager transactionManager() { 
     return new ResourcelessTransactionManager(); 
    } 

    @Bean 
    public MapJobRepositoryFactoryBean mapJobRepositoryFactory(ResourcelessTransactionManager txManager) 
      throws Exception { 
     MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(txManager); 
     factory.afterPropertiesSet(); 
     return factory; 
    } 

    @Bean 
    public JobRepository jobRepository(MapJobRepositoryFactoryBean factory) throws Exception { 
     return factory.getObject(); 
    } 

    @Bean 
    public JobExplorer jobExplorer(MapJobRepositoryFactoryBean factory) { 
     return new SimpleJobExplorer(factory.getJobInstanceDao(), factory.getJobExecutionDao(), 
       factory.getStepExecutionDao(), factory.getExecutionContextDao()); 
    } 

    @Bean 
    public SimpleJobLauncher jobLauncher(JobRepository jobRepository) { 
     SimpleJobLauncher launcher = new SimpleJobLauncher(); 
     launcher.setJobRepository(jobRepository); 
     return launcher; 
    }