Spring Планировщик не работает
У меня проблема с планировщиком задач на основе Spring на основе аннотаций - я не могу заставить его работать, я не вижу здесь никакой проблемы...
приложения context.xml
<task:scheduler id="taskScheduler" />
<task:executor id="taskExecutor" pool-size="1" />
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" />
bean
@Service
public final class SchedulingTest {
private static final Logger logger = Logger.getLogger(SchedulingTest.class);
@Scheduled(fixedRate = 1000)
public void test() {
logger.debug(">>> Scheduled test service <<<");
}
}
Ответы
Ответ 1
Если вы хотите использовать подход task:annotation-driven
, и ваша аннотация @Scheduled не работает, вы, скорее всего, пропустили context:component-scan
в своем контексте xml.
Без этой строки spring не может догадаться, где искать ваши аннотации.
<context:component-scan base-package="..." />
Ответ 2
Spring @Конфигурация (не-xml-конфигурация) для задач, управляемых аннотациями
Просто добавьте @EnableScheduling в класс WebMvcConfig
@Configuration
@EnableWebMvc
@EnableAsync
@EnableScheduling
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/** Annotations config Stuff ... **/
}
Ответ 3
Наконец-то я нашел решение.
приложения context.xml
<bean id="schedulingTest" class="...SchedulingTest" />
<task:scheduled-tasks>
<task:scheduled ref="schedulingTest" method="test" cron="* * * * * ?"/>
</task:scheduled-tasks>
и test()
без аннотации. Этот метод выполняется каждую секунду и отлично работает.
Ответ 4
если у вас есть dispatcher-servlet.xml, переместите туда свою конфигурацию. он работал у меня, и я оставил комментарий в этой статье:
fooobar.com/questions/245019/...
Ответ 5
Это происходит потому, что по умолчанию Spring lazy инициализирует beans.
Отключите ленивую инициализацию для bean, разместив эту аннотацию
@Lazy(false)
поверх @Component
.
Ответ 6
Вы также должны проверить lazy-init как false для этого bean или использовать default-lazy-init="false"
в beans.
Это решило мою проблему.
Ответ 7
Решением для меня было добавить в applicationContext.xml:
<task:annotation-driven/>
со следующей схемой:
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
Ответ 8
У нас была следующая причина:
Службе нужен интерфейс (из-за аннотации транзакции). IDE добавила эту аннотацию tx и к интерфейсу. Но @Scheduled занимался внедрением класса сервиса - и Spring игнорировал его, поскольку считал, что на интерфейсе существуют только аннотации. Поэтому будьте внимательны только для аннотаций по реализации классов!
Ответ 9
Мне пришлось обновить свой dispatcher-servlet.xml с помощью
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.3.xsd"></beans>
Определение бина ниже:
<bean id="scheduledTasks" class="com.vish.services.scheduler.ScheduledTasks"></bean>
Ответ 10
Для меня решение, которое работало в Spring 5, заключалось в том, что мне пришлось добавить @Component
в класс с аннотированными методами @Scheduled
.
Ответ 11
Просто добавьте @EnableScheduling в любой класс конфигурации весенней загрузки, аннотированный @Configuration, а для метода, выполняющего задание расписания, добавьте аннотацию @Scheduled.