Spring TaskScheduler Bean未注入

6

我需要在会话创建时安排一个作业。因此,我创建了我的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)。


@Autowired 对于 taskScheduler 不起作用吗?它是否被自动扫描了?请分享 Spring 配置文件。 - Braj
请尝试仅使用@Autowired,删除@Qualifier - Mithun
请问您能分享一下您正在使用的XML配置吗?您是否在配置中定义了taskScheduler? - Ankit
我没有XML配置文件,我正在使用Spring Boot。这里有一个类似的例子:https://github.com/joshlong/boot-examples/blob/master/websockets/src/main/java/demo/Application.java - Yanis26
1个回答

9
我在使用简单的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调度代码使用的相同的。


我已经在实现SchedulingConfigurer接口,但是我遇到了同样的问题。由于某种原因,*configureTasks(ScheduledTaskRegistrar)*方法只有在获取TaskScheduler实例(通过taskScheduler()方法)并注入到我的组件之后才会被调用。@allenru感谢你的代码片段! - vimterd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接