2009-09-05 14 views
9

Estaba leyendo la documentación de spring framework y encontré una sección sobre cómo generar eventos en Spring utilizando ApplicationContext. Después de leer algunos párrafos, descubrí que los eventos de primavera se desarrollan sincrónicamente. ¿Hay alguna forma de generar eventos asincrónicos? su ayuda es muy apreciada. Estoy buscando algo similar que me ayudaría a completar mi módulo.Eventos de Spring Framework

Respuesta

3

más simple ApplicationListener asíncrono:

Editorial:

@Autowired 
private SimpleApplicationEventMulticaster simpleApplicationEventMulticaster; 

@Autowired 
private AsyncTaskExecutor asyncTaskExecutor; 

// ... 

simpleApplicationEventMulticaster.setTaskExecutor(asyncTaskExecutor); 

// ... 

ApplicationEvent event = new ApplicationEvent(""); 
simpleApplicationEventMulticaster.multicastEvent(event); 

Oyente:

@Component 
static class MyListener implements ApplicationListener<ApplicationEvent> 
    public void onApplicationEvent(ApplicationEvent event) { 
     // do stuff, typically check event subclass (instanceof) to know which action to perform 
    } 
} 

Debe aplicar la subclase ApplicationEvent con sus eventos específicos. Puede configurar SimpleApplicationEventMulticaster y su taksExecutor en un archivo xml.

Es posible que desee implementar ApplicationEventPublisherAware en su clase de escucha y pasar un objeto de origen (en lugar de cadena vacía) en el constructor de eventos.

1

El resorte en sí (AFAIK) funciona sincrónicamente, pero lo que puede hacer es crear su propio proxy ApplicationListener - una clase que implementa esta interfaz pero en vez de manejar el evento simplemente lo delega enviando a otro (o nuevo) hilo , enviando mensajes JMS, etc.

3

Se pueden lograr estrategias de notificación alternativas implementando ApplicationEventMulticaster (ver Javadoc) y su jerarquía de clases subyacente (auxiliar). Normalmente, utiliza un mecanismo de notificación basado en JMS (como ya sugirió David) o se adjunta a la abstracción de Spring TaskExecuter (consulte Javadoc).

0

Prueba esto anula el grano ApplicationEventMulticaster en resources.groovy para que utilice un grupo de subprocesos:

algo como esto funcionó para mí, es decir, utilicé

import java.util.concurrent.* 
import org.springframework.context.event.* 

beans = { 
    applicationEventMulticaster(SimpleApplicationEventMulticaster) { 
     taskExecutor = Executors.newCachedThreadPool() 
    } 
} 
Cuestiones relacionadas