2012-06-05 9 views
15

Tengo varios servicios que están escuchando eventos Spring para realizar cambios en mi modelo de datos subyacente. Todos estos funcionan implementando ApplicationListener<Foo>. Una vez que todos los oyentes Foo modifiquen el modelo de datos subyacente, mi interfaz de usuario debe actualizarse para reflejar los cambios (piense en fireTableDataChanged()).¿Puedo asegurar que uno de mis Spring ApplicationListeners se ejecute al final?

¿Hay alguna forma de garantizar que un escucha específico para Foo siempre sea el último? ¿O hay alguna forma de llamar a una función cuando todos los otros oyentes están listos? Estoy usando el cableado basado en anotaciones y la configuración de Java, si eso importa.

+1

¿Puedes intentar implementar ['Ordered'] (http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/Ordered.html) en cada uno de tus oyentes y ajustar orden apropiadamente? –

+0

@TomaszNurkiewicz Eso parece prometedor, lo intentaré en un segundo. – Luke

+0

@TomaszNurkiewicz ¿Te importa poner eso en una respuesta para que pueda darte crédito por ello? Eso funcionó muy bien! – Luke

Respuesta

26

Todos sus beans implementando ApplicationListener también deben implementar Ordered y proporcionar un valor de orden razonable. Cuanto menor sea el valor, será invocado más pronto a su oyente:

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

Además se pueden implementar PriorityOrdered para asegurarse de que uno de sus oyentes siempre se invoca en primer lugar.

+0

¿Es posible que se ignore el orden para los detectores de eventos auth? Tuve 'CustomAuthListener implementa ApplicationListener , Ordered', pero el' return LOWEST_PRECEDENCE' nunca se llamó. Afortunadamente solo tuve que escuchar 'InteractiveAuthenticationSuccessEvent' en lugar de' AuthenticationSuccessEvent' para solucionar mi problema. –

Cuestiones relacionadas