Spring Batch не находит глобальные одноэлементные компоненты в веб-приложении - что не так? - PullRequest
1 голос
/ 01 апреля 2019

У меня есть пружинное веб-приложение, которое регистрирует несколько пакетных заданий пружины для длительной фоновой обработки во время запуска. Насколько я могу судить, контексты Spring-Batch не знают о синглетах, объявленных в корневом bean-компоненте AnnotationConfigWebApplicationContext, поэтому для каждой работы создается несколько копий сложных для инициализации компонентов как при начальной загрузке приложения, так и при время выполнения.

Я определил, что в AbstractBeanFactory.doGetBean() бин правильно идентифицируется как одноэлементный, но по какой-то причине фабрика бинов для задания не знает о фабрике бинов для родительского контекста.

Я переформировал некоторые компоненты в область действия Application, но компонент области применения (по-видимому) недопустим в контексте весеннего пакета.

Либо я что-то неправильно понимаю в области пружин, либо что-то не так с моей инициализацией элементов подпружиненной партии (код ниже). Я склоняюсь к обоим, так как одно приведет к другому.

Поскольку я понимаю области действия Spring, я должен видеть что-то вроде этого, с каждой дочерней областью, способной видеть синглеты, определенные в родительской области:

AnnotationConfigWebApplicationContext (web application context)
        |
        v
ResourceXmlApplicationContext (1 per registered job)
        |
        v
ResourceXmlApplicationContext (1 per registered step)

Код инициализации, о котором идет речь:

@Component("mySingletonScopedBean")
@Scope(value = "singleton", proxyMode = ScopedProxyMode.DEFAULT)
@Order(1)
public class MySingletonScopedBean {
    // getters, setters, etcetera
}


// EDIT: Added in response to comment below
@Autowired
public ApplicationContext applicationContext;

@Bean
public ClasspathXmlApplicationContextsFactoryBean classpathXmlApplicationContextsFactoryBean () throws IOException
{
    String resourcePath = somePath "*.xml";

    logger.trace("classpathXmlApplicationContextsFactoryBean()  :: {} ", resourcePath);
    Resource[] resources = applicationContext.getResources(resourcePath);


    ClasspathXmlApplicationContextsFactoryBean bean = new ClasspathXmlApplicationContextsFactoryBean ();
    bean.setApplicationContext(applicationContext);
    bean.setResources(resources);

    return bean;
}

@Bean
public AutomaticJobRegistrar automaticJobRegistrar() throws IOException, Exception {

    ClasspathXmlApplicationContextsFactoryBean c = classpathXmlApplicationContextsFactoryBean ();

    AutomaticJobRegistrar automaticJobRegistrar = new AutomaticJobRegistrar();
    automaticJobRegistrar.setApplicationContext(applicationContext);
    automaticJobRegistrar.setApplicationContextFactories(c.getObject());
    automaticJobRegistrar.setJobLoader(jobLoader());

    return automaticJobRegistrar;
}

@Bean
public JobLoader jobLoader() {
    DefaultJobLoader jobLoader = new DefaultJobLoader(jobRegistry(), stepRegistry());
    return jobLoader;
}

@Bean
public StepRegistry stepRegistry() {
    MapStepRegistry stepRegistry = new MapStepRegistry();
    return stepRegistry;
}

@Bean
public JobRegistry jobRegistry() {
    JobRegistry jobRegistry = new MapJobRegistry();
    return jobRegistry;
}

Редактировать: Закрытие

Инициализация всей весенней среды была испорчена.

Я экономлю свои знания о «чистой» модели впрыскивания и о том, как больно разбираться с вещами, когда они ломаются к массивной записи в блоге после этого проекта.

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