2012-06-05 5 views
15

Ich habe mehrere Dienste, die auf Spring-Ereignisse warten, um Änderungen an meinem zugrunde liegenden Datenmodell vorzunehmen. Diese funktionieren alle durch Implementierung ApplicationListener<Foo>. Sobald alle Foo Listener das zugrunde liegende Datenmodell ändern, muss meine Benutzeroberfläche aktualisiert werden, um die Änderungen widerzuspiegeln (denken Sie fireTableDataChanged()).Kann ich sicherstellen, dass einer meiner Spring ApplicationListeners zuletzt ausgeführt wird?

Gibt es eine Möglichkeit sicherzustellen, dass ein bestimmter Listener für Foo immer zuletzt ist? Oder gibt es eine Möglichkeit, eine Funktion aufzurufen, wenn alle anderen Listener fertig sind? Ich verwende Annotation-basierte Verkabelung und Java-Konfiguration, wenn das wichtig ist.

+1

Können Sie versuchen, ['Ordered'] (http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/Ordered.html) in jedem Ihrer Listener zu implementieren und anzupassen richtig bestellen? –

+0

@TomaszNurkiewicz Das sieht vielversprechend aus, ich werde es in einer Sekunde versuchen. – Luke

+0

@TomaszNurkiewicz Pflege Sie setzen das in eine Antwort, so kann ich Ihnen Anerkennung dafür geben? Das hat super funktioniert! – Luke

Antwort

26

Alle Ihre Beans, die ApplicationListener implementieren, sollten auch Ordered implementieren und angemessenen Auftragswert zur Verfügung stellen. Je niedriger der Wert, desto schneller Ihre Zuhörer wird aufgerufen:

class FirstListener implements ApplicationListener<Foo>, Ordered { 
    public int getOrder() { 
     return 10; 
    } 
    //... 
} 

class SecondListener implements ApplicationListener<Foo>, Ordered { 
    public int getOrder() { 
     return 20; 
    } 
    //... 
} 

class LastListener implements ApplicationListener<Foo>, Ordered { 
    public int getOrder() { 
     return LOWEST_PRECEDENCE; 
    } 
    //... 
} 

Außerdem Sie PriorityOrdered implementieren können sicher eine Ihrer Zuhörer machen wird immer zuerst aufgerufen.

+0

Ist es möglich, dass die Reihenfolge für Auth-Ereignis-Listener ignoriert wird? Ich hatte 'CustomAuthListener implementiert ApplicationListener , Ordered', aber die' Rückgabe LOWEST_PRECEDENCE' wurde nie aufgerufen. Glücklicherweise musste ich nur 'InteractiveAuthenticationSuccessEvent' anstelle von' AuthenticationSuccessEvent' hören, um mein Problem zu beheben. –

Verwandte Themen