我需要在创建会话时安排作业。 所以我创建了我的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)
答案 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的调度代码使用的相同。