2009-09-05 4 views
9

Ich habe im Frühjahr Framework-Dokumentation gelesen und fand einen Abschnitt auf Ereignisse im Frühjahr mit ApplicationContext auslösen. Nachdem ich einige Absätze gelesen habe, habe ich festgestellt, dass die Federereignisse synchron ausgelöst werden. Gibt es eine Möglichkeit, asynchrone Ereignisse auszulösen? Deine Hilfe ist sehr Willkommen. Ich suche etwas Ähnliches, das mir helfen würde, mein Modul zu vervollständigen.Spring Framework-Ereignisse

Antwort

3

Simplest asynchronen ApplicationListener:

Verlag:

@Autowired 
private SimpleApplicationEventMulticaster simpleApplicationEventMulticaster; 

@Autowired 
private AsyncTaskExecutor asyncTaskExecutor; 

// ... 

simpleApplicationEventMulticaster.setTaskExecutor(asyncTaskExecutor); 

// ... 

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

Zuhörer:

Sie sollten ApplicationEvent mit Ihren spezifischen Ereignissen ableiten. Sie können SimpleApplicationEventMulticaster und seinen TaksExecutor in einer XML-Datei konfigurieren.

Sie könnten ApplicationEventPublisherAware in Ihrer Listener-Klasse implementieren und ein Quellobjekt (anstelle einer leeren Zeichenfolge) im Ereigniskonstruktor übergeben.

1

Spring selbst (AFAIK) arbeiten synchron, aber was Sie tun können, ist Ihre eigenen ApplicationListener Proxy erstellen - eine Klasse, die diese Schnittstelle implementiert, aber statt das Ereignis zu delegieren es nur durch Senden an einen anderen (oder neuen) Thread Senden von JMS-Nachrichten usw.

3

Alternative Benachrichtigungsstrategien können durch Implementieren von ApplicationEventMulticaster (siehe Javadoc) und der ihr zugrunde liegenden (Hilfs-) Klassenhierarchie erreicht werden. Normalerweise verwenden Sie entweder einen JMS-basierten Benachrichtigungsmechanismus (wie David bereits vorgeschlagen hat) oder hängen Sie an die TaskExecuter-Abstraktion von Spring an (siehe Javadoc).

0

Versuchen Sie das ApplicationEventMulticaster Bohne in resources.groovy außer Kraft setzen, so dass es einen Thread-Pool verwendet:

Manche Dinge wie diese für mich gearbeitet, also habe ich

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

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