java - 未注入(inject) Spring TaskScheduler Bean

标签 java spring task jobs schedule

我需要在创建 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/

相关文章:

C# 控制台执行

java - 如何从枚举创建下拉菜单?

spring - 使用 Config Server 清洁部署 Spring Boot 微服务

c# - 如何取消执行非托管 C++ 外部例程的任务

html - C编程任务,html源文件

c# - 任务继续未安排在线程池线程上

java - Android - 在通知显示之前删除或取消通知

java - 使用一系列 lambda 函数来定义类功能是否合适?

java - 将自定义消息从 Servlet 传递到 JSP 页面?

java - 处理多种表单,Spring