最近用springboot整合websocket和定时任务时,出现报错信息Unexpected use of scheduler
启动类
@EnableWebSocket
@EnableScheduling
public class MpApplication {
public static void main(String[] args) {
SpringApplication.run(MpApplication.class, args);
}
定时执行方法
@Component
public class ScheduleController {
@Scheduled(cron = "0 0/1 * * * ?")
public void NowTime() {
System.out.println("time->" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
报错信息
`java.lang.IllegalStateException: Unexpected use of scheduler.
at org.springframework.web.socket.config.annotation.WebSocketConfigurationSupport$NoOpScheduler.schedule(WebSocketConfigurationSupport.java:108) ~[spring-websocket-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.scheduling.config.ScheduledTaskRegistrar.scheduleCronTask(ScheduledTaskRegistrar.java:414) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
....
报错代码
private static class NoOpScheduler implements TaskScheduler {
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
throw new IllegalStateException("Unexpected use scheduler.");
}
...
}
原来是方法实现直接抛出的,看来这是没有找到适合Scheduler对象时创建的一个没有任何意义的类,看源码
if (registry.requiresTaskScheduler()) {
ThreadPoolTaskScheduler threadPoolScheduler = new ThreadPoolTaskScheduler();
threadPoolScheduler.setThreadNamePrefix("SockJS-");
threadPoolScheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
threadPoolScheduler.setRemoveOnCancelPolicy(true);
this.scheduler = threadPoolScheduler;
}
else {
this.scheduler = new NoOpScheduler();
}
在注册一个合适的Scheduler失败时,直接创建了一个NoOpScheduler对象。@Scheduled注解会调用这个没有任何意义的Scheduler,那么手动创建一个taskScheduler是不是就行了呢
@Bean
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
return taskScheduler;
}
果然,启动没有报错,定时任务也可以执行
time->2018-09-20 15:09:00
time->2018-09-20 15:10:00
备注:https://blog.csdn.net/weixin_42478901/article/details/82793571