Tareas Java Spring @Scheduled ejecutándose dos veces

4 minutos de lectura

avatar de usuario
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.

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

Producción:

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

avatar de usuario
nicholas.hauschild

Si observa la documentación, hay una nota que menciona explícitamente este fenómeno.

la nota esta debajo apartado 25.5.1 en este enlacey lee:

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

    – cuerda

    1 de marzo de 2017 a las 9:30

avatar de usuario
usuario2408678

¡¡Yo se la respuesta!!

No inicie su Programado dos veces

Saquea tu registro web:

WebApplicationContext una vez y servlet una vez

así que en tu servlet.xml no hagas esto

import resource="classpath:applicationContext.xml"

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.

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

  2. El contexto se carga dos veces.

  3. 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.

avatar de usuario
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.

avatar de usuario
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?

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
Privacidad