Весенняя партия бобов - PullRequest
       13

Весенняя партия бобов

0 голосов
/ 29 сентября 2019

Отличается ли расположение бинов при загрузке их в контекстную область? Это ошибка или проблема с моментом создания экземпляра?

Если я включаю @StepScope и @Bean непосредственно в класс BatchConfiguration, все работает без проблем с StepScope. Однако если я определю другой класс, скажем «BatchProcessProcessor», как указано ниже, и помечу метод в этом другом классе как Bean-компонент с помощью StepScope, он не будет разрешен должным образом. Фактическим признаком в весеннем пакете является то, что StepScope не запускается, а компоненты загружаются как синглтоны.

Что-то в предоставлении @Bean и @StepScope из другого класса, который загружается с помощью инжекции конструктора в BatchConfiguration, не разрешается должным образом.

Формат, описанный выше, включенный ниже:

Класс конфигурации основного пакета

@Slf4j
@Configuration
@EnableAutoConfiguration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {

    private BatchProcessProcessor processor;

    @Override
    public void setDataSource(DataSource dataSource) {
        // override to do not set datasource even if a datasource exist.
        // initialize will use a Map based JobRepository (instead of database)
    }

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autwired
    public BatchConfiguration(BatchProcessProcessor processor){
        this.processor = processor;
    }

    @Bean
    @StepScope
    public ListItemReader<String> reader() {
        List<String> stringList = new ArrayList<>();
        stringList.add("test");
        stringList.add("another test");
        log.info("LOGGING A BUNCH OF STUFF THIS IS UNIQUE" + String.valueOf(System.currentTimeMillis()));
        return new ListItemReader<>(stringList);
    }

    @Bean
    @StepScope
    public CustomWriter writer() {
        return new CustomWriter();
    }

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1)
                .end()
                .build();
    }

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

}

Класс контейнера процессора

@Component
public class BatchProcessProcessor {

    private MyService service;

    @Autowired
    BatchProcessProcessor(MyService service){
        this.service= service;
    }

    /**
     * Generate processor utilized for processing
     * @return StringProcessor for testing
     */
    @Bean
    @StepScope
    public DeploymentProcesser processor() {
        return new DeploymentProcessor(service);
    }
}

Фактический процессор

@Slf4j
@Component
public class DeploymentProcesser implements ItemProcessor<Deployment, Model> {

    private MyService service;

    @Autowired
    public DeploymentProcesser(MyService service){
        this.service= service;
    }

    @Override
    public Model process(final Deployment deployment) {
        log.info(String.format("Processing %s details", deployment.getId()));
        Model model = new Model();
        model.setId(deployment.getId());
        return model;
    }
}

Насколько я понимаю, когда загружается BatchConfiguration, он должен внедрить BatchProcessProcessor и загрузить бин с помощью степоскопа, но, похоже, это не работает.

Как я уже говорил, просто скопируйтевставка @ Bean / @ StepScope непосредственно в BatchConfiguration и возврат того же DeploymentProcessor работает отлично, и StepScope решает.

Это проблема жизненного цикла?

1 Ответ

1 голос
/ 29 сентября 2019

Нет смысла объявлять bean-компонент в классе, помеченном @Component:

@Component
public class BatchProcessProcessor {

   private MyService service;

   @Autowired // This is correct, you can autowire collaborators
   public DeploymentProcesser(MyService service){
       this.service= service;
   }

   @Bean // THIS IS NOT CORRECT
   @StepScope
   public DeploymentProcesser processor() {
      return new DeploymentProcessor(service);
   } 
}

Вы должны делать это в классе конфигурации, помеченном @Configuration. Вот почему это работает, когда вы делаете это в BatchConfiguration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...