2015-03-13 4 views
0

Мне нужно запланировать задание при создании сеанса. Так что я создал свой HttpSessionListener:Spring TaskScheduler Bean не вводится

@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 компонент не вводили (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 Ботинок, у меня нет файла конфигурации. Это конфигурация на основе Java (как видно из второго фрагмента кода). @Autowired и @Qualifier не работают для TaskScheduler (работает для PanierService)

+0

«@ Autowired» не работает для 'taskScheduler'? Автоматически сканируется? share spring config file. – Braj

+0

Не могли бы вы попробовать только с помощью '@ Autowired'. Удалите '@ Qualifier'. – Mithun

+0

не могли бы вы рассказать о конфигурации xml, которую используете? вы определили taskScheduler в своей конфигурации? – Ankit

ответ

3

Я столкнулся с этим с помощью простого веб-сервера Spring MVC. Я не смог найти в этом контексте компонент taskScheduler или компонент ScheduledTaskRegistrar.

Чтобы решить эту проблему, я изменил мой класс конфигурации для реализации SchedulingConfigurer, и в рамках метода configureTasks, я поставил планировщик задач на тот, который явно объявлен в конфигурации (как компонента.) Вот мой 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.