2015-05-25 7 views
15

ich very simple examples Online verfolgt habe noch einen cron-Job im Frühjahr einzurichten Ich halte diesen Fehler in meinem Tomcat-Start einloggen jedes Mal bekommen:Mit @Scheduled und @EnableScheduling aber gibt NoSuchBeanDefinitionException

2015-05-25 00:32:58 DEBUG ScheduledAnnotationBeanPostProcessor:191 - 
Could not find default TaskScheduler bean org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined 

2015-05-25 00:32:58 DEBUG ScheduledAnnotationBeanPostProcessor:202 - Could not  
find default ScheduledExecutorService bean 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying  
bean of type [org.springframework.scheduling.TaskScheduler] is defined 

Und die 2 Java-Klassen verwendet, um die cron zu implementieren:

1) die @Configuration Klasse:

@Configuration 
@EnableScheduling 
public class ClearTokenStoreCronEnable {  
    final static Logger log = 
    LoggerFactory.getLogger(ClearTokenStoreCronEnable.class); 
    private @Autowired TokenStoreRepository tokenStoreRepository; 
} 

und cron Jobklasse:

@Service 
public class ClearTokenStoreWorkerService { 

    final static Logger log = LoggerFactory.getLogger(ClearTokenStoreWorkerService.class); 
    private @Autowired TokenStoreRepository tokenStoreRepository; 

    //@Scheduled(fixedDelay=5000) 
    //run daily at midnight 
    @Scheduled(cron = "0 0 * * * *") 
    public void tokenStoreTable() { 
     log.debug("tokenstore table truncated - start"); 
     tokenStoreRepository.deleteAll(); 
     log.debug("tokenstore table truncated - end"); 
    } 
} 

Als eine Nebenbemerkung läuft der Cron-Job um Mitternacht, aber es scheint auch zu anderen Zeiten zufällig zu laufen. Nicht sicher, ob dies ein Bug oder mein Cron-Ausdruck ist falsch: @Scheduled(cron = "0 0 * * * *")

Mein Hauptanliegen ist zu diesem Zeitpunkt, warum bin ich ScheduledAnnotationBeanPostProcessor Fehler zu bekommen? Es sucht nach einem TaskScheduler und ScheduledExectorService. Ich muss nur einmal am Tag feuern. Ich mache keine gleichzeitige Verarbeitung oder wo ich mehrere Threads brauche. Letztendlich sind diese Fehler schädlich ODER muss ich sie beheben?

+0

Der erste Cron-Ausdruck oben, den ich benutzte, fand ich nicht richtig. Der richtige Ausdruck für das Schießen einmal am Tag um Mitternacht ist: @Scheduled (cron = "0 0 0 * *?") – logixplayer

Antwort

14

EDIT: die beste Antwort ist here und es sich um einen Executor zu schaffen:

@Configuration 
@EnableAsync 
public class AppContext extends WebMvcConfigurationSupport { 
    @Bean 
    public Executor taskExecutor() { 
     return new SimpleAsyncTaskExecutor(); 
    } 
} 

PREVIOUS (noch gültig obwohl):

Die NoSuchBeanDefinitionException mit DEBUG Schwere angemeldet ist und sicher ignoriert werden kann. Wenn Sie sich den Quellcode für ScheduledAnnotationBeanPostProcessor betrachten, sehen Sie, dass es zunächst eine Taskscheduler, dann ein ScheduledExecutorService zu bekommen versucht, dann hält es los „fallen zurück zum Standard-Scheduler“:

if (this.registrar.hasTasks() && this.registrar.getScheduler() == null) { 
     Assert.state(this.beanFactory != null, "BeanFactory must be set to find scheduler by type"); 
     try { 
      // Search for TaskScheduler bean... 
      this.registrar.setScheduler(this.beanFactory.getBean(TaskScheduler.class)); 
     } 
     catch (NoUniqueBeanDefinitionException ex) { 
      throw new IllegalStateException("More than one TaskScheduler exists within the context. " + 
        "Remove all but one of the beans; or implement the SchedulingConfigurer interface and call " + 
        "ScheduledTaskRegistrar#setScheduler explicitly within the configureTasks() callback.", ex); 
     } 
     catch (NoSuchBeanDefinitionException ex) { 
      logger.debug("Could not find default TaskScheduler bean", ex); 
      // Search for ScheduledExecutorService bean next... 
      try { 
       this.registrar.setScheduler(this.beanFactory.getBean(ScheduledExecutorService.class)); 
      } 
      catch (NoUniqueBeanDefinitionException ex2) { 
       throw new IllegalStateException("More than one ScheduledExecutorService exists within the context. " + 
         "Remove all but one of the beans; or implement the SchedulingConfigurer interface and call " + 
         "ScheduledTaskRegistrar#setScheduler explicitly within the configureTasks() callback.", ex); 
      } 
      catch (NoSuchBeanDefinitionException ex2) { 
       logger.debug("Could not find default ScheduledExecutorService bean", ex); 
       // Giving up -> falling back to default scheduler within the registrar... 
      } 
     } 
    } 

Sie die Ausnahme entfernen durch mindestens eine INFO Schwere Einstellung auf org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor, wie

<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> 

wenn logback verwenden.

Der Cron-Ausdruck hat sechs Felder:

second (0-59), minute (0-59), hour (0-23, 0 = midnight), day (1-31), month (1-12), weekday (1-7, 1 = Sunday) 

Die Syntax kann in der quartz docs finden. Ich bin mir nicht sicher über das "?" Zeichen, weil, obwohl die Seite sagt

Die '?' Für die Felder "Tag" und "Wochentag" ist ein Zeichen zulässig. Es wird verwendet, um "keinen spezifischen Wert" anzugeben. Dies ist nützlich, wenn Sie etwas in einem der beiden Felder angeben müssen, nicht jedoch das andere.

die Beispiele auf dieser Seite tatsächlich verwenden? auch wenn das andere Feld * ist. IMHO alles mit nur *, so arbeiten, um sollte immer um Mitternacht auszuführen, sollte der Ausdruck

0 0 0 * * * 
2

sein Ich bin damit einverstanden Sie können es ignorieren, aber nur die Schwere Veränderung wird es nicht beheben. Ich hatte das gleiche Problem, aber ich verwende XML anstelle von Anmerkungen, und in meinem Fall geschah es, weil ich den Executor nicht in meine Bean-Definition aufgenommen hatte. Also fügte das hinzu:

<task:annotation-driven executor="myExecutor" 
    scheduler="myScheduler" /> 
<task:executor id="myExecutor" pool-size="5" /> 
<task:scheduler id="myScheduler" pool-size="10" /> 

Ich hoffe es hilft.

Grüße.

11

nach Ausnahme Info „Es kann keine Standard-Taskscheduler Bohne finden“, sollte die Konfiguration definieren „Taskscheduler“ statt „Executor“

@Configuration 
public class AppContext extends WebMvcConfigurationSupport { 
    @Bean 
    public TaskScheduler taskScheduler() { 
     return new ConcurrentTaskScheduler(); 
    } 

    // Of course , you can define the Executor too 
    @Bean 
    public Executor taskExecutor() { 
     return new SimpleAsyncTaskExecutor(); 
    } 

}

1

Zur Lösung dieses Problems nur Taskplaner Bean erstellen in der Konfig.

@Bean 
    public TaskScheduler taskScheduler() { 
     return new ConcurrentTaskScheduler(); 
    }