可以使用配置了WebSocketConfigurer的websocket,也可以使用@Scheduled来安排任务,没有任何问题。但是,当我同时使用它们时,java不会编译。
@Schedule注解会因org.springframework.web.socket.config.annotation.WebSocketConfigurationSupport $ NoOpScheduler.scheduleAtFixedRate()而抛出如下异常。
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-07-29 15:03:06 ERROR o.s.boot.SpringApplication - Application run failed
java.lang.IllegalStateException: Unexpected use of scheduler.
at org.springframework.web.socket.config.annotation.WebSocketConfigurationSupport$NoOpScheduler.schedule(WebSocketConfigurationSupport.java:108)
查看错误源码如下:
@Nullable
public ScheduledFuture<?> schedule(Runnable task, Trigger trigger) {
throw new IllegalStateException("Unexpected use of scheduler.");
}
可以看出在WebSocketConfigurationSupport源码中定义了一个schedule方法,该方法会直接抛出一个IllegalStateException异常,该方法对于所有@Schedule注解有效,因此会与@Schedule冲突。
解决方案如下:
通过显式创建显式创建任务调度程序bean解决:
@Bean
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
return taskScheduler;
}