Почему Spring работает мой метод @Scheduled?
Я немного одурманен, потому что я пытаюсь использовать аннотации @Scheduled
, но Spring, похоже, не находит мои методы. Конечным результатом является то, что ни один из моих методов, аннотированных с помощью @Scheduled
, не выполняется.
Я вызвал магию задач Spring со следующими объявлениями:
<beans> <!-- XMLNS, XSD declarations omitted for brevity -->
<context:component-scan base-package="com.mypackage"/>
<task:executor id="executor" pool-size="5"/>
<task:scheduler id="scheduler" pool-size="5"/>
<task:annotation-driven scheduler="scheduler" executor="executor"/>
</beans>
И у меня есть интерфейс, который выглядит примерно так:
package com.mypackage;
public interface MyInterface {
public void executePeriodically();
}
С соответствующим импотентом:
package com.mypackage.impl;
// imports omitted for brevity
@Service
public class MyInterfaceImpl implements MyInterface {
@Scheduled(cron = "0/5 * * * * ?")
public void executePeriodically() {
System.out.println("The time is now : " + new Date());
}
}
Теперь ожидаемый результат состоит в том, что у меня очень шумный маленький парень, рассказывающий мне, в какое время это каждые 5 секунд... но на самом деле я ничего не получаю. Я попытался с аннотацией по методу интерфейса и методу impl, но это ничего не меняет.
Я точно знаю, что исполнитель и планировщик инициализируются, потому что в моем журнале есть следующее:
INFO - ThreadPoolTaskExecutor - Initializing ExecutorService
INFO - XmlWebApplicationContext - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO - XmlWebApplicationContext - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO - ThreadPoolTaskScheduler - Initializing ExecutorService 'scheduler'
INFO - XmlWebApplicationContext - Bean 'scheduler' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
Я не уверен, что эта линия о том, что вы не имеете права, имеет значение или красная селедка.
В настоящий момент я работаю над этим, объявляя свои запланированные задачи следующим образом:
<task:scheduled-tasks>
<task:scheduled ref="sourceDocumentManagerImpl" method="deleteOldDocuments" cron="0 0 * * * ?"/>
</task:scheduled-tasks>
Пока это работает отлично, я бы скорее использовал аннотации, потому что гораздо удобнее видеть непосредственно в коде, какие ожидания для этого метода. Кто-нибудь знает, что я могу делать неправильно? Для записи я использую Spring 3.0.4
Спасибо, куча!
Ответы
Ответ 1
Итак... похоже, что проблема в Spring 3.0.x(по крайней мере 3.0.4 и 3.0.5) связана с обнаружением аннотаций @Scheduled
на прокси-серверах AOP. У меня есть объявление pointcut, обертывающее метод @Scheduled
транзакционным советом, и это, по-видимому, является корнем проблемы. Если я удалю совет, работа запустится. Если я добавлю его обратно, Spring не сможет найти и создать задачу для моего аннотированного метода.
Итак, я собираюсь сделать файл с сообщением Spring, и тем временем я застрял, объявляя свои задачи вручную.
Ответ 2
добавить "task: annotation-driven"?
<beans> <!-- XMLNS, XSD declarations omitted for brevity -->
<context:component-scan base-package="com.mypackage"/>
<task:annotation-driven/>
<task:executor id="executor" pool-size="5"/>
<task:scheduler id="scheduler" pool-size="5"/>
<task:annotation-driven scheduler="scheduler" executor="executor"/>
</beans>
ссылка http://howtodoinjava.com/2013/04/23/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/
или
Spring @Конфигурация (не-xml-конфигурация) для задач, управляемых аннотациями
Просто добавьте @EnableScheduling в класс WebMvcConfig
@Configuration
@EnableWebMvc
@EnableAsync
@EnableScheduling
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/** Annotations config Stuff ... **/
}
ссылка Spring Планировщик не работает
Ответ 3
Несмотря на то, что я использую Spring 3.1.2, я сталкиваюсь с той же проблемой, если я помещаю свой тег-исполнитель и планировщик в ApplicationContext.xml. У меня есть два файла конфигурации xml для Spring в моем проекте:
- applicationContext.xml
- диспетчер-servlet.xml
Итак, попробуйте переместить вашу конфигурацию в последний файл конфигурации, который читает Spring. в моем случае он начинает работать, перемещая мою конфигурацию в dispatcher-servlet.xml
вот мой пример:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<bean id="config" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="/WEB-INF/configuration.properties" />
</bean>
<!-- To fix the problem with Unicode characters in ajax responses -->
<bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<array>
<bean class = "org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
</bean>
<bean id="byteArrayMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
</array>
</property>
</bean>
<!-- Hibernate Configuration
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/iss"
p:username="root"
p:password="root"
-->
<bean name="DataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="org.postgresql.Driver"
p:url="jdbc:postgresql://localhost:5432/iss"
p:username="postgres"
p:password=""
/>
<!--<bean name="SessionFactory" class="org.springframework.orm.hibernate4.annotation.AnnotationSessionFactoryBean">-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="DataSource" />
</property>
<property name="hibernateProperties">
<props>
<!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>-->
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<!--<prop key="hibernate.current_session_context_class">thread</prop>-->
<!--<prop key="hibernate.current_session_context_class">managed</prop>-->
<!--<prop key="hibernate.search.default.indexBase">/tmp/hibernate/indexes/</prop>-->
<!--<prop key="hibernate.flushMode">AUTO</prop>-->
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.connection.autocommit">false</prop>
</props>
</property>
<property name="packagesToScan" value="iss.DB" />
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<mvc:interceptors>
<bean class="org.springframework.orm.hibernate4.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</mvc:interceptors>
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
<!-- in this file it wont work
<task:executor id="myExecutor" pool-size="1" />
<task:scheduler id="myScheduler" pool-size="1" />
<task:annotation-driven
executor="myExecutor"
scheduler="myScheduler"/>
-->
</beans>
диспетчер-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"
xmlns:context="http://www.springframework.org/schema/context">
<bean class="org.springframework.web.servlet.mvc.support.AnnotationControllerTypePredicate"/>
<context:component-scan base-package="iss"/>
<context:component-scan base-package="com.hazhir"/>
<!--Internationalization -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="iss.languages.text" />
</bean>
<bean id="localChangeInterseptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="en_US" />
<property name="cookieName" value="clientLanguage" />
<property name="cookieMaxAge" value="99999999"/>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="alwaysUseFullPath" value="true" />
<property name="interceptors">
<list>
<ref bean="localChangeInterseptor" />
</list>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp">
<property name="exposeContextBeansAsAttributes" value="true" />
</bean>
<!-- Multipart form data -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000000" />
</bean>
<context:annotation-config />
<!-- here is a right place for such configuration
-->
<task:executor id="myExecutor" pool-size="1" />
<task:scheduler id="myScheduler" pool-size="1" />
<task:annotation-driven
executor="myExecutor"
scheduler="myScheduler"/>
</beans>
надеюсь, что это поможет.
Ответ 4
Я исправил это, добавив default-lazy-init = "false" в мой applicationContext.xml.
<beans .....
**default-lazy-init="false"**>
Ответ 5
Единственное отличие, которое я вижу в моей настройке (которая работает), заключается в том, что мой класс аннотируется @Component
, а не @Service
. Другие вещи для проверки:
- У вас есть подходящие банки в пути к классам (spring -context, я думаю)
- поставить точку останова и проверить, действительно ли она не выполняется
- дважды проверьте выражение cron (я согласен, что я всегда обращаюсь к документам для этого). Или используйте фиксированную задержку, просто чтобы проверить, работает ли она.
- попробуйте обновить до 3.0.5 или последний снимок 3.1.
Ответ 6
I Решите его, удалив use-default-filters = "false" в контексте: компонент-сканирование
моя старая конфигурация
<context:component-scan base-package="com.XXXx" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
my spring версия 3.2.3
Ответ 7
Я решил, добавив оба:
xmlns:task="http://www.springframework.org/schema/task"
xmlns:tx="http://www.springframework.org/schema/tx"
то
<!-- TASK -->
<task:scheduler id="searchScheduler" pool-size="1"/>
<task:executor id="searchExecutor" pool-size="1"/>
<task:annotation-driven executor="searchExecutor" scheduler="searchScheduler"/>
и в bootom моего приложенияContext.xml:
<tx:annotation-driven/>