Итак, у меня возникла небольшая проблема с некоторыми запланированными задачами, которые я объявил с помощью аннотации Spring * @Scheduled
. Прежде всего, вот мой app-config:
<beans <!--Namespaces-->>
<!-- Search for annotated beans -->
<context:component-scan base-package="com.my.package.task"/>
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>
<tx:annotation-driven/>
</beans>
У меня также есть класс AppConfig:
@Configuration
@ImportResource("classpath:/config/app-config.xml")
public class AppConfig {
//Bean declarations but NO references to the Scheduled tasks or their classes
}
И вот объявленные мной запланированные задачи:
public abstract class ScheduledTask {
private ApplicationContext appContext;
abstract void doSomething();
protected getAppContext() {
if(appContext == null) {
appContext = new AnnotationConfigApplicationContext(AppConfig.class);
}
return appContext;
}
//Other common methods
}
@Service
public class Task1 extends ScheduledTask {
@Scheduled(cron="0 0 9 * * MON-FRI")
public void doSomething() {
System.out.println("Task1 -- Thread ID: " + Thread.currentThread().getId() + " Thread Name: " + Thread.currentThread().getName());
//Update the database with new values
}
}
@Service
public class Task2 extends Scheduledtask {
@Scheduled(cron="0 0 10 * * MON-FRI")
public void doSomething() {
System.out.println("Task2 -- Thread ID: " + Thread.currentThread().getId() + " Thread Name: " + Thread.currentThread().getName());
//Get some data from database and send email with data from DB
}
}
Теперь проблема, с которой я сталкиваюсь, заключается в том, что при выполнении этих задач я получаю несколько электронных писем (см. Задача 2). Я добавил в операторы print, чтобы увидеть, вызывались ли методы несколько раз, и Task2 выполняется дважды двумя разными потоками. Я надеюсь, что Spring вызовет запланированное задание только один раз. Вот вывод, который я получаю:
Task1 -- Thread ID: 10 Thread Name: myScheduler-1
Task2 -- Thread ID: 23 Thread Name: myScheduler-2
Task2 -- Thread ID: 11 Thread Name: myScheduler-2
И если я запускаю его ночью и устанавливаю задания cron примерно на 4 часа, я начинаю получать еще больше электронных писем (хотя у меня не было возможности узнать, связано ли это с несколькими вызовами потоков / методов). 1014 *
Есть ли у кого-нибудь идеи, что может быть причиной многократных вызовов второго задания? Я посмотрел на Spring Documentation и под «Заметкой» упоминается, что вы можете получить несколько вызовов, если вы инициализируете несколько экземпляров класса @Scheduled
во время выполнения. Может ли это происходить здесь с моим AppConfig и app-config.xml?