tareas quartz programadas mvc example ejemplo configurar java spring schedule

quartz - tareas programadas en java



Java Spring @ Tareas programadas ejecutando dos veces (14)

Aquí tengo un método de prueba simple que se configura para ejecutarse cada 5 segundos y lo hace, pero al mirar System.out puede ver que parece estar haciendo algo extraño.

@Scheduled(cron="*/5 * * * * ?") public void testScheduledMethod() { System.out.println(new Date()+" > Running testScheduledMethod..."); }

Salida:

Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod... Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod... Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod... Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod... Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod... Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod... Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod... Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod...

¿Por qué se ejecuta DOS VECES (aparece) cada vez?


Si nos fijamos en la documentación, hay una nota que llama explícitamente a este fenómeno.

La nota se encuentra en la sección 25.5.1 de este enlace y dice:

Asegúrese de no inicializar varias instancias de la misma clase de anotación programada en el tiempo de ejecución, a menos que desee programar devoluciones de llamadas para cada instancia. Relacionado con esto, asegúrese de no utilizar @Configurable en las clases de bean que están anotadas con @Scheduled y registradas como beans Spring regulares con el contenedor: De lo contrario, obtendría la inicialización doble, una vez en el contenedor y una vez en el aspecto @Configurable , con la consecuencia de que cada método @Scheduled se invoque dos veces.

Entiendo que esto es solo una sugerencia en este momento, pero no creo que tengamos suficiente información para diagnosticar el problema más.


¡¡Yo se la respuesta!!

No inicie su Scheduled dos veces

Saquea tu registro web:

WebApplicationContext una vez y servlet una vez

entonces en tu servlet.xml no hagas esto

import resource="classpath:applicationContext.xml"


está sucediendo debido al oyente del contexto

Solo eliminar

<oyente>

<listener-class> org.springframework.web.context.ContextLoaderListener </ listener-class>

</ oyente>

desde web.xml debería funcionar.


Estoy usando la primavera 4.0.3 y tengo este problema. Lo resolví cambiando el nombre de mis frijoles.

a:

<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" /> <task:executor id="taskExecutor" pool-size="25" /> <task:scheduler id="taskScheduler" pool-size="25" />

Observé un registro INFO que decía que no se encontró ningún bean llamado taskScheduler, creando una nueva instancia. Así que pensé que había dos instancias de taskScheduler.

Avísame si esto también funciona para ti :)


Bueno, en mi caso, el bean del trabajo tenía la anotación @Component y tuve esto en mi applicationContext.xml:

<task:annotation-driven/> <bean id="getxxx" class="com.kitar.xxxx.jobs.RomeExample"></bean>

Entonces la solución es eliminar la definición de bean (la segunda línea) porque:

<task:annotation-driven/> : permite la detección de anotaciones @Async y @Scheduled en cualquier objeto gestionado por Spring, por lo que no es necesario definir el bean del trabajo o se llamará dos veces.


De acuerdo con este post y Spring Jira, este es un error en el componente Spring Framework Scheduler.


Me encontré con un problema similar. Podría ser por razones a continuación.

  1. Un error en las versiones de primavera https://jira.spring.io/browse/SPR-10830

  2. Contexto cargado dos veces.

  3. Log4j.xml que escribe los registros dos veces. Sucedió en mi caso, no estoy seguro del tuyo. Si ha probado las otras opciones, pruebe también esta.


Es posible que desee comprobar si está escaneando componentes para el mismo paquete en dos contextos diferentes si su aplicación es WEB, por ejemplo, applicationContext.xml y luego otra some-servlet.xml.


<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/root-context.xml /WEB-INF/spring/security/spring-security.xml /WEB-INF/spring/mongo/mongo-config.xml /WEB-INF/spring/appServlet/spring-context.xml </param-value> </context-param> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/spring-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

Ese es mi web.xml. Por lo tanto, puede ver que "/WEB-INF/spring/appServlet/spring-context.xml" se carga dos veces (una vez en context-param, una en servlet -> init-param).


He enfrentado la misma situación y solucionado esto:

1) Servicio de agenda

@Service public class SchedulerService { @Autowired @Qualifier("WorkerClass") private Worker worker; @Scheduled(cron="0/5 * * * * ?", zone="Asia/Colombo")//zone is a sample public void doSchedule() { worker.work(); } }

2) Clase trabajadora

@Component("WorkerClass") public class WorkerClass implements Worker { @Override public void work() { doSomething(); } protected void doSomething() { system.out.pringln("What must I do?"); } }


Tuve el mismo problema hoy.

En mi proyecto estaba usando el programador con mi aplicación de arranque de primavera y en mi clase de ScheduledTaks estaba usando la anotación @Component. Pero cometí un error porque el @Component representa un bean para mi clase y en mi clase de aplicación he creado otro bean para esta clase con el código:

public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } @Bean public ScheduledTasks getScheduledTasks() { return new ScheduledTasks(); } }

Solo eliminé esta anotación y el planificador funciona de manera perceptiva.

Sigue el ejemplo de mi código clase ScheduledTasks:

public class ScheduledTasks { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(cron = "00 14 11 * * *") public void reportCurrentTime() { log.info("The date is: {} " + dateFormat.format(new Date()) ); } }

Y el resultado:

2016-10-20 11:13:41.298 INFO 6832 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2016-10-20 11:13:41.302 INFO 6832 --- [ main] br.com.Application : Started Application in 9.257 seconds (JVM running for 9.676) 2016-10-20 11:14:00.002 INFO 6832 --- [pool-2-thread-1] br.com.scheduler.ScheduledTasks : The date is: {} 11:14:00


Tuve un problema similar, resolví el mío haciendo esto:

package com.sample.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @EnableScheduling public class JobExecutorConfig { }

como configuración para el arranque de primavera. Y agrego esto como clase de trabajo:

package com.sample.jobs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class Job { private final Logger log = LoggerFactory.getLogger(this.getClass()); @Autowired MyOtherClass moc; @Scheduled(fixedRate = 60000) // every 60 seconds public void doJob() { log.debug("Job running !!!"); try { moc.doSomething() } catch (Exception e) { log.error(e.getMessage()); } finally { log.debug("job Done !!!"); } } // examples of other CRON expressions // * "0 0 * * * *" = the top of every hour of every day. // * "*/10 * * * * *" = every ten seconds. // * "0 0 8-10 * * *" = 8, 9 and 10 o''clock of every day. // * "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o''clock every day. // * "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays // * "0 0 0 25 12 ?" = every Christmas Day at midnight }


Tuve el mismo problema, y ​​finalmente descubrí que el problema estaba ocurriendo como resultado de que los beans se creaban en el root context , así como en el servlet context .

Entonces, para solucionar esto, debe separar la creación de los beans en los contextos apropiados.

Esta respuesta explica muy bien cómo eso y fue lo que solucionó mi problema.


Yo tuve el mismo problema. Pasó horas tratando de resolver.

La solución fue que la aplicación se implementó dos veces en Tomcat.

Al intentar limpiar Tomcat dio un error.

Comprobando el archivo server.xml Tomcat noté que lo mismo se estaba implementando dos veces. También había una etiqueta de "host" no cerrada. No estoy seguro de cuál de estos lo arregló, pero me alivió tenerlo funcionando correctamente nuevamente.