tareas scheduled quartz programadas expresiones examples ejemplo java spring spring-mvc tomcat scheduled-tasks

java - scheduled - spring quartz ejemplo



La tarea Spring @Scheduled se ejecuta dos veces (3)

Estoy creando una tarea @Scheduled para ejecutar cada 5 segundos. Como ha sido un problema en otras preguntas, ¡mi tarea se ejecuta dos veces!

He consultado otras preguntas y he leído la documentación correspondiente aquí , pero no he podido descifrar el problema.

Sé que dos instancias separadas de mi clase @Scheduled se @Scheduled instancias cuando inicio mi servidor tomcat. También me di cuenta cuando se crearon instancias en referencia a mi archivo de registro.

Uno asociado con esta línea de registro:

INFORMACIÓN: Inicializando Spring root WebApplicationContext

y otro con esta línea de registro:

INFORMACIÓN: Inicializando Spring FrameworkServlet ''servlet''

Aquí está el archivo de configuración de primavera.

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:security="http://www.springframework.org/schema/security" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> <context:component-scan base-package="web.controllers"/> <context:component-scan base-package="services"/> <context:component-scan base-package="dao"/> <context:component-scan base-package="scheduled"/> <context:property-placeholder location="/WEB-INF/application.properties"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <task:annotation-driven />

Y mi clase simple de Java:

package scheduled; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @Service public class Notifier { @Scheduled(fixedDelay = 5000) public void notifyUsersOfBidItems() { try { System.out.println(this); } catch (Exception e) { e.printStackTrace(); } } }

Además, estoy usando Spring 4.

EDITAR: Adding web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>servlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring_config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>servlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring_config.xml</param-value> </context-param> <error-page> <error-code>404</error-code> <location>/error/notFound</location> </error-page> <error-page> <error-code>403</error-code> <location>/error/notFound</location> </error-page> <error-page> <location>/error/internal</location> </error-page> <!-- Spring Security --> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>


Creo que esto es causado por el mismo archivo de configuración que se carga dos veces en su web.xml

<servlet> <servlet-name>servlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring_config.xml</param-value> <!-- FIRST --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring_config.xml</param-value> <!-- SECOND --> </context-param>

EDITAR Para solucionarlo:

Cree otro archivo servlet-servlet.xml (esto será recogido por la configuración de ServletDispatcher de forma predeterminada ya que coincide con el archivo por nombre de servlet) El archivo contendrá esto:

<beans> <context:component-scan base-package="web.controllers"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> </beans>

Modifique el archivo original (spring-config.xml):

<beans> <task:annotation-driven /> <context:component-scan base-package="services"/> <context:component-scan base-package="dao"/> <context:component-scan base-package="scheduled"/> <context:property-placeholder location="/WEB-INF/application.properties"/> </beans>

Modifique su configuración de servlet xml web a lo siguiente:

<servlet> <servlet-name>servlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>


solución: Quartz + Spring doble ejecución java config

getServletConfigClasses () -> return null;

public static class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{WebConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }

solución de código de ejemplo


Yo también tuve este problema. Estoy usando Spring 4. No tengo configuración xml. Todo está configurado con anotaciones y configuración de Java.

Tengo una configuración básica y una configuración web. el error fue causado al usar @ComponentScan en ambas configuraciones. Eliminé el análisis de componentes de la configuración base.

@EnableWebMvc @ComponentScan(basePackages = { "com.myservice" }) @Configuration public class WebConfiguration extends WebMvcConfigurerAdapter { @Bean public UrlBasedViewResolver setupViewResolver() { UrlBasedViewResolver resolver = new UrlBasedViewResolver(); resolver.setPrefix("/WEB-INF/jsp/"); resolver.setSuffix(".jsp"); resolver.setViewClass(JstlView.class); return resolver; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } @Configuration @EnableScheduling //@ComponentScan(basePackages = { "com.myservice" }) @PropertySource("${myservice.properties.location:classpath:myservice.properties}") public class BaseConfiguration { @Autowired Environment environment; @Bean public static PropertySourcesPlaceholderConfigurer properties() { return new PropertySourcesPlaceholderConfigurer(); }