2012-06-05 8 views
15

Mam kilka usług, które nasłuchują zdarzeń wiosennych, aby wprowadzić zmiany w moim podstawowym modelu danych. Wszystko to działa poprzez implementację ApplicationListener<Foo>. Gdy wszystkie detektory Foo modyfikują bazowy model danych, mój interfejs użytkownika musi odświeżyć, aby odzwierciedlić zmiany (pomyśl fireTableDataChanged()).Czy mogę zapewnić, że jeden z moich Spring ApplicationListeners zostanie wykonany jako ostatni?

Czy istnieje sposób na zapewnienie, że określony słuchacz dla Foo jest zawsze ostatni? Czy jest jakiś sposób wywołania funkcji, gdy wszystkie inne słuchacze są wykonywane? Używam okablowania opartego na adnotacjach i konfiguracji Java, jeśli to ma znaczenie.

+1

Czy możesz spróbować implementacji polecenia ['Zamówione'] (http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/Ordered.html) w każdym ze słuchaczy i dostosować zamówić odpowiednio? –

+0

@TomaszNurkiewicz To wygląda obiecująco, spróbuję to za chwilę. – Luke

+0

@TomaszNurkiewicz zadbał o to, abyś to ujął w odpowiedzi, abym mógł ci to przyznać? To działało świetnie! – Luke

Odpowiedz

26

Wszystkie twoje fasolki wdrażające ApplicationListener powinny również wdrożyć Ordered i zapewnić rozsądną wartość zamówienia. Im niższa wartość, tym szybciej Twój słuchacz zostanie wywołany:

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; 
    } 
    //... 
} 

Ponadto można zaimplementować PriorityOrdered, aby upewnić się jednym z twoich słuchaczy jest zawsze wywoływana pierwszy.

+0

Czy to możliwe, że zamówienie jest ignorowane dla detektorów zdarzeń auth? Miałem 'CustomAuthListener implementuje ApplicationListener , Zamówione', ale' return LOWEST_PRECEDENCE' nigdy nie został wywołany. Na szczęście po prostu musiałem posłuchać 'InteractiveAuthenticationSuccessEvent' zamiast' AuthenticationSuccessEvent', aby naprawić mój problem. –

Powiązane problemy