Spring没有注入Spring TaskScheduler Bean

时间:2015-03-13 05:04:45

标签: java spring task jobs schedule

我需要在创建会话时安排作业。 所以我创建了我的HttpSessionListener:

@Component
public class WebSessionListener implements HttpSessionListener {

//@Autowired
@Qualifier(value = "taskScheduler")
private ThreadPoolTaskScheduler taskScheduler;
@Autowired
private PanierService panierService;

//Notification that a session was created.
@Override
public void sessionCreated(HttpSessionEvent httpSessionCreatedEvent) {

    Runnable viderPanier20mnJob = PanierJobs.getViderPanier20mnJob(httpSessionCreatedEvent.getSession());
    taskScheduler.schedule(viderPanier20mnJob, PanierJobs.getNextDateTime());
    System.out.println("Session Created Called! -----------------------");
}

但我的主要问题是我的TaskScheduler bean没有被注入(NoSuchBeanDefinition或有时它只是弹出NullPointerException)。

这是我的TaskScheduler(取自它工作的一个例子):

@Configuration
@EnableScheduling
@EnableAsync
public class JobSchedulingConfig{

  @Bean
   public ThreadPoolTaskExecutor taskExecutor() {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        return executor;
    }

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {

        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        return scheduler;
    }
}

我正在使用Spring Boot,我没有配置文件。它是基于Java的配置(如第二个代码片段所示)。 @Autowired和@Qualifier不适用于TaskScheduler(适用于PanierService)

1 个答案:

答案 0 :(得分:4)

我用一个简单的Spring MVC Web服务器遇到了这个问题。我无法在上下文中找到taskScheduler bean或ScheduledTaskRegistrar bean。

为了解决这个问题,我更改了配置类以实现SchedulingConfigurer,并且在configureTasks方法中,我将任务调度程序设置为在配置中显式声明的一个(作为bean。)这是我的java配置:

@Configuration
@EnableScheduling
@EnableAsync
public class BeansConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setTaskScheduler(taskScheduler());
    }

    @Bean
    public TaskScheduler taskScheduler() {
        return new ConcurrentTaskScheduler(); //single threaded by default
    }
}

这有一个令人遗憾的副作用,我宣布任务调度程序,而不是让Spring默认它,因为它认为合适。我选择在Spring 4.2.4中使用相同的(并发任务调度程序中的单线程执行程序)实现。

通过实现SchedulingConfigurer接口,我确保我创建的任务调度程序与Spring的调度代码使用的相同。