为什么MVC线程无法提供JobScope和StepScope?

时间:2019-01-15 19:29:36

标签: spring-batch

我从工作工厂班上获得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。工厂是在正确的作业/步骤范围内从主应用程序启动期间调用的Bean创建作业和步骤Bean的地方。

@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在Job / Steps范围内自动注册任何bean的尝试都会失败,并显示该类型的错误。如果这些作用域仅在(我想)一个作业正在运行时可用,那么如何从在Tomcat中运行的主MVC应用程序的线程在作用域中“创建” bean?

2 个答案:

答案 0 :(得分:0)

  

为什么MVC线程无法提供JobScope和StepScope?

这些是特定于Spring Batch的自定义范围,它们不是Spring MVC的一部分。您需要专门注册它们(或使用@EnableBatchProcessing来自动注册它们)

  

如何从Tomcat中运行的主MVC应用程序的线程在范围内“创建” bean?

主线程(处理Web请求)应调用配置有异步JobLauncher的{​​{1}},以便批处理作业在单独的线程中执行。请参阅Running Jobs from within a Web Container部分,其中提供了更多详细信息以及如何执行此操作的代码示例。

答案 1 :(得分:0)

我终于找到了答案:@EnableBatchProcessing在MVC应用程序上下文中不起作用。在我创建的@Configuration bean中,它用于配置SB(使用DB2)并设置所有SB bean(例如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的一部分添加?只能通过命令行工具使用吗?