java - 使用 Spring 创建 Scheduler Bean 时出现 NullPointerException

标签 java spring cron quartz-scheduler

我正在尝试使用 Spring 创建一个调度程序。

@Configuration
@EnableScheduling
public class MyScheduler {


  @Autowired
  MyBusinessService businessService;


  @Scheduled(cron = "* * * * * *")
  public void myCronMethod() {

  }
}

在应用程序启动期间,我收到以下错误:

java.lang.NullPointerException
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.resolveSchedulerBean(ScheduledAnnotationBeanPostProcessor.java:281)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.finishRegistration(ScheduledAnnotationBeanPostProcessor.java:221)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:200)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:94)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:383)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:337)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:882)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5068)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1572)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1562)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

ScheduledAnnotationBeanPostProcessor 中,holder 为空:

NamedBeanHolder<T> holder = ((AutowireCapableBeanFactory) this.beanFactory).resolveNamedBean(schedulerType);

schedulerType 是:

interface org.springframework.scheduling.TaskScheduler

该应用程序是一个 JSF 应用程序。我使用的是 java 8 和 spring 版本 4.3.6,但是使用 Ant 且没有依赖项管理,因此可能会丢失库或库不匹配。

最佳答案

刚刚在 Kotlin 应用程序中遇到同样的错误,我的解决方法是手动添加一个 TaskScheduler 到我的应用程序配置中:

Java例子取自from here .

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
    ThreadPoolTaskScheduler threadPoolTaskScheduler
      = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(5);
    threadPoolTaskScheduler.setThreadNamePrefix(
      "ThreadPoolTaskScheduler");
    return threadPoolTaskScheduler;
}

我的 Kotlin 版本是

@Bean
fun threadPoolTaskScheduler()
    = ThreadPoolTaskScheduler().apply {
        setPoolSize(5)
        setThreadNamePrefix("ThreadPoolTaskScheduler")
}

(我还没有尝试过,但我相信升级到 Spring 5 也会解决这个问题 - this commit 会在生成空指针的地方抛出一个异常。)

关于java - 使用 Spring 创建 Scheduler Bean 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45378590/

相关文章:

java - Kotlin 中的一切都是对象吗?

java - 在同一项目中使用内存身份验证和数据库身份验证

bash - 多个 cronjob 电子邮件

java - 将字符串转换为 UTF-8 字符时的奇怪行为

java - IDE 强制用 try/catch 包围而不抛出异常

java - 环境变量中的数据库凭据?

java - 如何从 2 个不同的父项创建 Maven 模块?

spring - 在 CRON JOBS 中执行方法

PHP MySQL 和服务器效率

java - 有什么方法可以控制 Swing 组件的缩放吗?