我从工作工厂班上获得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?
答案 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的一部分添加?只能通过命令行工具使用吗?