2017-11-20 1 views
0

Ich habe nicht die ordnungsgemäße Verwendung von @Componenet, @ Konfiguration, @ Bean Annotation verstanden. Ich möchte eine Methode alle 60 Sekunden ausführen. Bitte überprüfen Sie den folgenden Code. Wenn ich @Component Annotation nicht gebe, wird es nicht ausgeführt. Was nutzt @Component in diesem Zusammenhang?Warum muss ich @Component hinzufügen, wenn ich die Aufgabe im Spring Boot einplanen muss

@EnableScheduling 
    public class SchedulingProjectApplication { 

    private static final Logger log = 
    LoggerFactory.getLogger(SchedulingProjectApplication.class); 

    public static void main(String[] args) { 
     SpringApplication.run(SchedulingProjectApplication.class, args); 
    } 

    @Scheduled(fixedDelay = 6000) 
    public void r() 
    { 
     log.info("Start- main-job"); 
     log.info("stop-main-job"); 
    } 

    } 
+0

Dies ist zu Frühling, um diese Datei beim Hochfahren zu scannen. Spring liest diese Datei nur, wenn sie eine der Spring-Anmerkungen enthält. Und nur wenn es scannt, kann es lesen, dass Sie einen Scheduler konfiguriert haben und planen, – pvpkiran

Antwort

0

Es gibt mehrere Probleme mit diesem Stück Code:

  1. Ihr Frühling Boot-Anwendung nicht mit @SpringBootApplication (oder @EnableAutoConfiguration) gekennzeichnet ist. Daher wird die automatische Konfiguration überhaupt nicht aktiviert (Spring Boot startet Ihre App, macht aber nichts anderes als grundlegende Dinge wie die Vorbereitung von env usw.). In bestimmten Fällen ist das völlig in Ordnung, aber das ist wahrscheinlich nicht das, was Sie wollen.
  2. Sie haben die Aufgabe direkt in Ihrer App markiert. Es ist für Demo in Ordnung, aber es wäre besser, diese Logik in seiner eigenen Klasse zu bewegen

So Ihre Frage zu beantworten: SchedulingProjectApplication ist die Wurzel Quelle Ihrer Anwendung, aber es ist nur eine einfache POJO. Es gibt nichts, was den Container anweist, es zu verarbeiten. Normalerweise ist die App ist ein @Configuration (Sie eines der @EnableXYZ auf sie verwenden können, können Sie zusätzliche Bohnen definieren usw.

Wenn Sie @SpringBootApplication auf Ihrer Klasse hinzufügen, wird es jede @Component im selben Paket Ihrer Anwendung scannen (. und alle Unterpakete)

Mehr Details über Codestruktur in the documentation

Ein Grund/einfache Struktur für Sie sei:

package com.example.foo; 

@SpringBootApplication 
@EnableScheduling 
public class SchedulingProjectApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(SchedulingProjectApplication.class, args); 
    } 

} 

Und

package com.example.foo; 

@Component 
public class SchedulingLogger { 

    private static final Logger log = 
      LoggerFactory.getLogger(SchedulingLogger.class); 

    @Scheduled(fixedDelay = 6000) 
    public void r() 
    { 
     log.info("Start- main-job"); 
     log.info("stop-main-job"); 
    } 
} 

Es gibt andere Dinge, die Sie in Bezug auf Konfiguration (wie moving decisions outside of your @SpringBootApplication if you use slicing) bewusst sein sollten.

+0

meine Hauptklasse ist anders. Ich habe @springBootApplication zu meiner Hauptklasse annotiert. – user3432036

+0

Warum stellen Sie eine Frage mit nicht dem Code, den Sie dann tatsächlich verwenden? –

Verwandte Themen