不知道改了哪里,后面一直都是这个错误:
2021-07-23 18:53:06.383 [restartedMain] DEBUG o.s.b.diagnostics.LoggingFailureAnalysisReporter-report-37 - Application failed to start due to an exception
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.scheduling.TaskScheduler' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
具体是:

2021-07-23 18:53:06.383 [restartedMain] DEBUG o.s.b.diagnostics.LoggingFailureAnalysisReporter-report-37 - Application failed to start due to an exception org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.scheduling.TaskScheduler' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) at com.montnets.spgate.JavaGateApplication.main(JavaGateApplication.java:31) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) 2021-07-23 18:53:06.384 [restartedMain] ERROR o.s.b.diagnostics.LoggingFailureAnalysisReporter-report-40 - *************************** APPLICATION FAILED TO START *************************** Description: Field taskScheduler in com.montnets.spgate.umc.SmsCmppEventHandler required a bean of type 'org.springframework.scheduling.TaskScheduler' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'org.springframework.scheduling.TaskScheduler' in your configuration. Disconnected from the target VM, address: '127.0.0.1:53065', transport: 'socket' Process finished with exit code 1
郁闷了。之前都是好好的,后面不知道改了哪里引起的。
难道注解不起作用?
我明明已经添加了 相关注解了啊:
@EnableScheduling
@EnableAsync//启动异步
网上搜索半天,没有得到需要的,
有的说是加这个:
<logger name="org.springframework.scheduling">
<level value="info" />
</logger>
有的说是:
logging:
level:
org:
springframework:
scheduling: info
结果是都不行;
大量的搜索都是无果, 甚至于 stackoverflow 也是无果。
后面 找到了TaskSchedulingAutoConfiguration,估计是 条件不满足 ,把 启动配置的 debug 设置为true,果然如此!
看到了原因:
TaskSchedulingAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition)
TaskSchedulingAutoConfiguration#taskSchedulerBuilder matched:
- @ConditionalOnMissingBean (types: org.springframework.boot.task.TaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
TaskSchedulingAutoConfiguration#taskScheduler:
Did not match:
- @ConditionalOnMissingBean (types: org.springframework.scheduling.annotation.SchedulingConfigurer,org.springframework.scheduling.TaskScheduler,java.util.concurrent.ScheduledExecutorService; SearchStrategy: all) found beans of type 'org.springframework.scheduling.annotation.SchedulingConfigurer' cacheRefreshTimer (OnBeanCondition)
原来是 某个地方已经存在了SchedulingConfigurer bean,不过 cacheRefreshTimer 是什么意思... ?
SchedulingConfigurer 在哪里有定义吗? 全局搜索,无果。
搜索依赖工程源码,找到了! 原来是这货:
bean 名字正是: cacheRefreshTimer 。
那么,这样写有没有问题呢?
答案是不行, 他定义了SchedulingConfigurer 但是没有 同时注册TaskScheduler bean,所以导致了问题!
正确做法是 https://www.javarticles.com/2016/05/spring-configuring-taskscheduler-examples.html :

package com.javarticles.spring; import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.config.IntervalTask; import org.springframework.scheduling.config.ScheduledTaskRegistrar; @Configuration @EnableScheduling public class SpringSchedulingConfigurerBeanExample { private AtomicInteger counter = new AtomicInteger(0); @Scheduled(fixedRate = 2000) public void fixedRateJob() { int jobId = counter.incrementAndGet(); System.out.println("Job @ fixed rate " + new Date() + ", jobId: " + jobId); } public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( SpringSchedulingConfigurerBeanExample.class); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } finally { context.close(); } } @Configuration static class RegisterTaskSchedulerViaSchedulingConfigurer implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setTaskScheduler(poolScheduler()); taskRegistrar.addFixedRateTask(new IntervalTask( new Runnable() { @Override public void run() { System.out.println("Job @ fixed rate " + new Date() + ", Thread name is " + Thread.currentThread().getName()); } }, 1000, 0)); } @Bean public TaskScheduler poolScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setThreadNamePrefix("poolScheduler"); scheduler.setPoolSize(10); return scheduler; } } }
package
com.javarticles.spring;
import
java.util.Date;
import
java.util.concurrent.atomic.AtomicInteger;
import
org.springframework.context.annotation.AnnotationConfigApplicationContext;
import
org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration;
import
org.springframework.scheduling.TaskScheduler;
import
org.springframework.scheduling.annotation.EnableScheduling;
import
org.springframework.scheduling.annotation.Scheduled;
import
org.springframework.scheduling.annotation.SchedulingConfigurer;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import
org.springframework.scheduling.config.IntervalTask;
import
org.springframework.scheduling.config.ScheduledTaskRegistrar;
@Configuration
@EnableScheduling
public
class
SpringSchedulingConfigurerBeanExample {
private
AtomicInteger counter =
new
AtomicInteger(
0
);
@Scheduled
(fixedRate =
2000
)
public
void
fixedRateJob() {
int
jobId = counter.incrementAndGet();
System.out.println(
"Job @ fixed rate "
+
new
Date() +
", jobId: "
+ jobId);
}
public
static
void
main(String[] args) {
AnnotationConfigApplicationContext context =
new
AnnotationConfigApplicationContext(
SpringSchedulingConfigurerBeanExample.
class
);
try
{
Thread.sleep(
5000
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
finally
{
context.close();
}
}
@Configuration
static
class
RegisterTaskSchedulerViaSchedulingConfigurer
implements
SchedulingConfigurer {
@Override
public
void
configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(poolScheduler());
taskRegistrar.addFixedRateTask(
new
IntervalTask(
new
Runnable() {
@Override
public
void
run() {
System.out.println(
"Job @ fixed rate "
+
new
Date() +
", Thread name is "
+ Thread.currentThread().getName());
}
},
1000
,
0
));
}
@Bean
public
TaskScheduler poolScheduler() {
ThreadPoolTaskScheduler scheduler =
new
ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix(
"poolScheduler"
);
scheduler.setPoolSize(
10
);
return
scheduler;
}
}
}