我需要在创建 session 时安排作业。 所以我创建了我的 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 没有被注入(inject)(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)
最佳答案
我在一个简单的 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 接口(interface),我确保了我创建的任务调度程序与 Spring 的调度代码使用的相同。
关于java - 未注入(inject) Spring TaskScheduler Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29025207/