Tareas Java Spring @Scheduled ejecutándose dos veces
⏰ 4 minutos de lectura
KS1
Aquí tengo un método de prueba simple que está configurado para ejecutarse cada 5 segundos y lo hace, pero al mirar System.out puede ver que parece estar haciendo algo extraño.
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 está ejecutando DOS VECES? (aparecer) ¿cada vez?
¿Qué versión de Spring estás ejecutando? ¿Está seguro de que no está cargando el contexto dos veces, lo que hace que se creen dos subprocesos del programador?
– Swapnil
9 de enero de 2013 a las 17:12
intente iniciar sesión cuando se crea una instancia de la clase
– Amanuel Nega
27 de diciembre de 2016 a las 8:35
nicholas.hauschild
Si observa la documentación, hay una nota que menciona explícitamente este fenómeno.
Asegúrese de no inicializar varias instancias de la misma clase de anotación @Scheduled en tiempo de ejecución, a menos que desee programar devoluciones de llamada para cada una de esas instancias. En relación con esto, asegúrese de no usar @Configurable en las clases de bean que están anotadas con @Scheduled y registradas como beans Spring normales con el contenedor: de lo contrario, obtendría una inicialización doble, una vez a través del contenedor y otra vez a través del aspecto @Configurable , con la consecuencia de que cada método @Scheduled se invoque dos veces.
Entiendo que esto es simplemente una sugerencia en este momento, pero no creo que tengamos suficiente información para diagnosticar el problema más a fondo.
Ok, entonces, ¿exactamente en qué clase se debe declarar el método programado? Si lo tengo en una clase anotada con @Service, obtengo este comportamiento/
– demaniak
5 oct 2014 a las 17:22
En mi caso, también quería invocar manualmente la función programada con @WebServlet
Estaba declarando mi clase como un “Servicio” y también usando la anotación @Scheduled para declararla como Programador. El programador lo invoca normalmente, pero como declaramos la clase como un servicio. Se inició dos veces.
Eliminé la anotación de servicio. Y declaró esa clase como un frijol en el contexto XML que he mantenido. (XML de contexto personalizado que se declara en web.xml). Esto solucionó el problema para mí. Espero que ayude a alguien.
está sucediendo debido al oyente de contexto
solo elimina
< oyente >
< clase de escucha >org.springframework.web.context.ContextLoaderListener< /clase de escucha >
< /oyente >
desde web.xml debería funcionar.
Encontré un problema similar. Podría deberse a las siguientes razones.
El log4j.xml escribe los registros dos veces. Sucedió en mi caso, no estoy seguro sobre el tuyo. Si has probado las otras opciones, prueba esta también.
Comunidad
Tuve el mismo problema, y eventualmente descubrí que el problema estaba ocurriendo como resultado de la creación de beans en el root context así como 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 hacerlo y fue lo que solucionó mi problema.
ciberniños
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 arranque de resorte. 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
}
Todavía se está ejecutando dos veces, lo hice exactamente según su sugerencia, pero no funcionó de esa manera.
– iamrajshah
16 de enero de 2019 a las 9:15
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
¿Qué versión de Spring estás ejecutando? ¿Está seguro de que no está cargando el contexto dos veces, lo que hace que se creen dos subprocesos del programador?
– Swapnil
9 de enero de 2013 a las 17:12
intente iniciar sesión cuando se crea una instancia de la clase
– Amanuel Nega
27 de diciembre de 2016 a las 8:35