evan klinger opened SPR-16325 and commented
I have 3 @Service beans, each with a void method with @Scheduled annotations. Only one of these is picked up during startup. I have set log level to trace and even in the trace the ScheduledAnnotationBeanPostProcessor only detects it on one of the beans. The syntax, packages, and everything else are identical. I am using a cron expression with SpringEL to derive the cron value. All have the same cron value. All beans are annotated with @Profile (that is not active), each has a @PostConstruct method and one @Scheduled. I am not sure if this is a Spring bug or what could be causing this? I am registering a taskScheduler bean as follows:
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(4);
scheduler.setThreadNamePrefix("taskScheduler-");
scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
scheduler.setErrorHandler(t -> logger.error("Error executing scheduled task", t));
scheduler.initialize();
return scheduler;
}
This is in an @Configuration class that also implements SchedulingConfigurer and sets the scheduler like so:
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskScheduler());
}
Any help would be appreciated! Thank you
Affects: 5.0.2
Comment From: spring-projects-issues
evan klinger commented
ScheduledAnnotationBeanPostProcessor also doesn't even print that it doesn't find @Scheduled on those beans. But the beans are instantiated and the @PostConstruct method is called, so they are being detected.
Comment From: spring-projects-issues
Juergen Hoeller commented
So the profile conditions on those three beans are mutually exclusive? And depending on which profile is active, the @Scheduled annotations are supposed to be picked up on a specific one of those beans - and this doesn't work in all three cases?
I'm afraid this is a hard to analyze without a repro example.
Comment From: spring-projects-issues
evan klinger commented
Hi Juergen,
The @Profile is the same on all 3 beans.
I also have a few @Configuration classes but I don't see anything wrong there. App is run without any active profile.
@Configuration
@EnableAsync
@EnableScheduling
@Profile("!reservations")
public class SessionConfig implements AsyncConfigurer, SchedulingConfigurer
@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan(basePackages = { "com.jjk.hub" })
public class CoreConfig implements WebMvcConfigurer
Spring does detect the @Service classes since the @PostConstruct runs on them. But the @Scheduled is never discovered in those classes, except for one of them.
What would cause Spring to not search for @Scheduled on some beans? Is there a breakpoint I can set somewhere that would indicate why it's not being processed?
Thanks
Evan
Comment From: spring-projects-issues
evan klinger commented
Hi Juergen,
I think I have solved the issue. It appears that the @Configuration classes were clashing with each other, or somehow there was a cyclic dependency which caused the other beans to not be fully ready when @Scheduled is being checked. I have moved the beans' dependencies into one @Configuration and now the @Scheduled is found and registered correctly.
Thanks!