Почему JobScope и StepScope недоступны из потока MVC? - PullRequest
0 голосов
/ 15 января 2019

Я получаю Error creating bean with name 'scopedTarget.scopedTarget.processVlsCasesJob': Scope 'job' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton с класса фабрики вакансий.Фабрика - это место, где задание и шаговые компоненты создаются в правильных областях задания / шага из компонента, вызванного во время запуска основного приложения.

@Component("processVlsCasesJobFactory")
public class ProcessVlsCasesJobFactoryImpl
extends BatchJobFactoryAncestorImpl 
implements ProcessVlsCasesJobFactory {
...
@Bean
@Scope(scopeName = "job", proxyMode = ScopedProxyMode.INTERFACES)
public ProcessVlsCasesJob processVlsCasesJob() {
    return new ProcessVlsCasesJobImpl();
}
    ...
@Bean
@Scope(scopeName = "step", proxyMode = ScopedProxyMode.INTERFACES)
public ProcessVlsCasesProcessCases processVlsCasesProcessCases() {
    return new ProcessVlsCasesProcessCasesImpl();
}
    ...
    // other bean methods creating the step objects

Любая попытка разрешить Spring автоматически зарегистрировать любой компонент вОбъем задания / шагов завершается ошибкой с этим типом ошибки.Если эти области доступны только тогда, когда (я предполагаю) выполняется задание, как мне «создать» компонент в области действия из потока основного приложения MVC, запущенного в Tomcat?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я наконец нашел ответ: @EnableBatchProcessing не работает в контексте приложения MVC. В бине @Configuration, который я создал, чтобы сконфигурировать SB (с DB2) и настроить все бины SB (например, jobLauncher), я добавил:

jobScope = new JobScope();
jobScope.setAutoProxy(Boolean.FALSE);
jobScope.setName(JobScoped.SCOPE_NAME);
((ConfigurableBeanFactory)applicationContext.getAutowireCapableBeanFactory())
    .registerScope(JobScoped.SCOPE_NAME, jobScope);

stepScope = new StepScope();
stepScope.setAutoProxy(Boolean.FALSE);
stepScope.setName(StepScoped.SCOPE_NAME);
((ConfigurableBeanFactory)applicationContext.getAutowireCapableBeanFactory())
    .registerScope(StepScoped.SCOPE_NAME, stepScope);

Затем эти две области были наконец доступны во время выполнения, и bean-объекты области задания / шага были зарегистрированы при развертывании и работали правильно.

Был ли @EBP добавлен как часть Spring Boot? Предполагается, что он используется только через инструмент командной строки?

0 голосов
/ 16 января 2019

Почему JobScope и StepScope недоступны из потока MVC?

Это пользовательские области, специфичные для Spring Batch, они не являются частью Spring MVC. Вам необходимо специально зарегистрировать их (или использовать @EnableBatchProcessing для их автоматической регистрации)

как мне "создать" bean-компонент в области видимости из потока основного приложения MVC, запущенного в Tomcat?

Основной поток (обработка веб-запроса) должен вызвать JobLauncher, настроенный с асинхронным TaskExecutor, чтобы пакетное задание выполнялось в отдельном потоке. Ознакомьтесь с разделом Выполнение заданий в веб-контейнере , в котором приведены дополнительные сведения и пример кода.

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