2017-01-04 5 views
0

Ich habe eine SpringApplicationRunListener Implementierung wie folgt.So rufen Sie Funktionen in SpringApplicationRunListener

public class AppListener implements SpringApplicationRunListener { 
    private long appStartTimestamp; 
    private long appFinishTimestamp; 

    public AppListener(SpringApplication application, String[] args) { 
    } 

    @Override 
    public void started() { 
     appStartTimestamp = System.currentTimeMillis(); 
    } 

    @Override 
    public void environmentPrepared(ConfigurableEnvironment environment) { 
     //Not used. 
    } 

    @Override 
    public void contextPrepared(ConfigurableApplicationContext context) { 
     //Not used. 
    } 

    @Override 
    public void contextLoaded(ConfigurableApplicationContext context) { 
     //Not used. 
    } 

    @Override 
    public void finished(ConfigurableApplicationContext context, Throwable exception) { 
     appFinishTimestamp = System.currentTimeMillis(); 
    } 

    public long getAppStartTimestamp() { 
     return appStartTimestamp; 
    } 

    public long getAppFinishTimestamp() { 
     return appFinishTimestamp; 
    } 
} 

Ohne jegliche statische Methoden oder Variablen, wie kann ich nennen getAppStartTimestamp() und getAppFinishTimestamp() Funktionen die beiden Variablen zu bekommen? Der folgende Code funktioniert nicht, weil ich eine neue Instanz von AppListener initialisiere.

AppListener appListener = new AppListener(new SpringApplicationBuilder(Application.class).build(), null); 
appStartTimestamp = appListener.getAppStartTimestamp(); // 0 
appFinishTimestamp = appListener.getAppFinishTimestamp(); // 0 

Ich finde, dass AppListener nicht als Bohne gemacht werden, weil sie aufgerufen wird, bevor Spring-Bean-Management beginnt. Gibt es eine Möglichkeit, die laufende AppListener Instanz zum Aufruf der beiden Get-Funktionen zu bekommen? Vielen Dank.

Antwort

0

erstellen POJO die Anwendungsereignisdaten zu halten

@Component 
public class AppEventData { 

    private long appStartTimestamp; 
    private long appFinishTimestamp; 

    public long getAppStartTimestamp() { 
     return appStartTimestamp; 
    } 

    public void setAppStartTimestamp(long appStartTimestamp) { 
     this.appStartTimestamp = appStartTimestamp; 
    } 

    public long getAppFinishTimestamp() { 
     return appFinishTimestamp; 
    } 

    public void setAppFinishTimestamp(long appFinishTimestamp) { 
     this.appFinishTimestamp = appFinishTimestamp; 
    } 
} 

Jetzt ist Ihr Ziel Methode der Listener-Klasse aktualisiert den Wert von Start zu setzen und der Zeit in dem POJO

public class AppListener implements SpringApplicationRunListener { 
    private long appStartTimestamp; 
    private long appFinishTimestamp; 

    public AppListener(SpringApplication application, String[] args) { 
     super(); 
    } 

    @Override 
    public void started() { 
     appStartTimestamp = System.currentTimeMillis(); 
    } 

    @Override 
    public void environmentPrepared(ConfigurableEnvironment environment) { 
     //Not used. 
    } 

    @Override 
    public void contextPrepared(ConfigurableApplicationContext context) { 
     //Not used. 
    } 

    @Override 
    public void contextLoaded(ConfigurableApplicationContext context) { 
     //Not used. 
    } 

    @Override 
    public void finished(ConfigurableApplicationContext context, Throwable exception) { 
     appFinishTimestamp = System.currentTimeMillis(); 
     AppEventData data = context.getBean(AppEventData.class); 
     data.setAppStartTimestamp(appStartTimestamp); 
     data.setAppFinishTimestamp(appFinishTimestamp); 
    } 

    public long getAppStartTimestamp() { 
     return appStartTimestamp; 
    } 

    public long getAppFinishTimestamp() { 
     return appFinishTimestamp; 
    } 
} 

Nun beenden Sie Holen Sie die Daten von POJO von überall her, zum Beispiel zeige ich Ihnen die Hauptmethode.

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 

     AppEventData data = ctx.getBean(AppEventData.class); 
     System.out.println(data.getAppStartTimestamp()); 
     System.out.println(data.getAppFinishTimestamp()); 
    } 
} 

Es ist geschafft ....

Vergessen Sie nicht, den Hörer in src/main/resources/META-INF/spring.factories wie unten sonst der Zuhörer laufen nicht zu setzen.

org.springframework.boot.SpringApplicationRunListener=com.app.AppListener 
+0

Brilliante Idee. Es klappt! Vielen Dank! Weil ich 'AppEventData' in einer anderen Klasse verwende, so dass ich es einfach autowire. – NMSL