Spring batch Spring批处理异常:org.springframework.batch.core.launch.NoSuchJobException:未注册名为[]的作业配置

Spring batch Spring批处理异常:org.springframework.batch.core.launch.NoSuchJobException:未注册名为[]的作业配置,spring-batch,jobs,restart,Spring Batch,Jobs,Restart,当使用jobOperator.stop(id)停止正在运行的作业时,或者当我想使用jobOperator.restart(id)重新启动它时,我会看到此异常。 我不知道为什么MapJobRegistry是空的。。。我漏了一步吗? 我使用了来自的完整示例再现了这个问题 重新启动作业时堆栈跟踪 2020-11-12 21:47:16.452错误26252---[nio-8080-exec-3]o.a.c.c.c.[/].[dispatcherServlet]:路径为[]的上下文中Servlet[di

当使用jobOperator.stop(id)停止正在运行的作业时,或者当我想使用jobOperator.restart(id)重新启动它时,我会看到此异常。 我不知道为什么MapJobRegistry是空的。。。我漏了一步吗?
我使用了来自的完整示例再现了这个问题

重新启动作业时堆栈跟踪
2020-11-12 21:47:16.452错误26252---[nio-8080-exec-3]o.a.c.c.c.[/].[dispatcherServlet]:路径为[]的上下文中Servlet[dispatcherServlet]的Servlet.service()引发异常[请求处理失败;嵌套异常为org.springframework.batch.core.launch.NoSuchJobException:没有名为[importUserJob]的作业配置]已注册]具有根本原因

org.springframework.batch.core.launch.NoSuchJobException:未注册名为[importUserJob]的作业配置 在org.springframework.batch.core.configuration.support.MapJobRegistry.getJob(MapJobRegistry.java:68)~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.092] 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:1.8.092] 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.092] 在java.lang.reflect.Method.invoke(Method.java:498)~[na:1.8.092] 在org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:163)~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127)~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在com.sun.proxy.$Proxy68.getJob(未知源)~[na:na] 在org.springframework.batch.core.launch.support.SimpleJobOperator.restart(SimpleJobOperator.java:275)~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在org.springframework.batch.core.launch.support.SimpleJoboOperator$$FastClassBySpringCGLIB$$44ee6049.invoke()~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)~[spring-core-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.batch.core.launch.support.SimpleJobOperator$$EnhancerBySpringCGLIB$$853e8727.restart()~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在com.example.batchprocessing.BatchController.restartJob(BatchController.java:60)~[classes/:na] 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.092] 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:1.8.092] 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.8.092] 在java.lang.reflect.Method.invoke(Method.java:498)~[na:1.8.092] 在org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.servlet.mvc.method.annotation.ServletinInvocableHandlerMethod.invokeAndHandle(ServletinInvocableHandlerMethod.java:106)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
在org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]

JobOperator
需要一个
JobLocator
来定位要重新启动、停止等的作业。这个
JobLocator
(通常是
MapJobRegistry
)应使用已知作业填充,并且应手动或通过向应用程序上下文添加作业来完成


这里的参考文档对此进行了解释:。

我只是添加了一个JobRegistryBeanPostProcessor并将其设置为jobRegistry

   @Autowired
   JobRegistry jobRegistry;

   @Bean
   public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() {
       JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
       postProcessor.setJobRegistry(jobRegistry);
       return postProcessor;
   }

如果有帮助,请接受我的答案(你的答案似乎是基于我的):。谢谢。
@RestController
public class BatchController {

Logger logger = LoggerFactory.getLogger(BatchController.class);

@Autowired
JobLauncher simpleJobLauncher;

@Autowired
Job importUserJob;

@Autowired
JobOperator jobOperator;

@RequestMapping("/startNewJob")
public String handle()  {
    try {
        JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis())
                .toJobParameters();
        JobExecution jobExecution = simpleJobLauncher.run(importUserJob, jobParameters);

        return jobExecution.toString();
    } catch (Exception e) {
        logger.info(e.getMessage());
        return ("An error has occured, please check the logs");
    }
}

@RequestMapping("/stopJob/{id}")
public Boolean stopJob(@PathVariable Long id) throws Exception {
    logger.info("stopJob "+id);
    return jobOperator.stop(id);
}

@RequestMapping("/restartJob/{id}")
public Long restartJob(@PathVariable Long id) throws Exception {
    logger.info("restartJob "+id);
    return jobOperator.restart(id);
}
}
   @Autowired
   JobRegistry jobRegistry;

   @Bean
   public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() {
       JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
       postProcessor.setJobRegistry(jobRegistry);
       return postProcessor;
   }