2012-03-30 18 views
0

Ich implementiere eine Listener-Klasse, die auf einige Ereignisse wartet und sie dann verarbeitet. Wenn die Verarbeitung dieses Ereignisses gut verläuft, wird dieses Ereignis nie erneut gemeldet, aber im Falle einer Ausnahme wird das Ereignis nach einiger Zeit erneut an die MyBeanImplementation-Klasse gemeldet, und es kann erneut versuchen, es zu verarbeiten.Mehrere Instanzen einer Bean

Der folgende Code funktioniert gut, aber da diese Ereignisverarbeitung einige Zeit dauern kann,
1. Ich möchte mehrere Listener haben.
2. Begrenzen Sie die Anzahl der Anrufe an den Dienst, möglicherweise mit Threadpool.

Wie kann ich mehrere Listener haben, die jedes Ereignis unterschiedlich verarbeiten? Ich bin neu bei Spring und habe keine Ahnung, ob das überhaupt möglich ist oder nicht.

Heres ein Beispiel:

// Frühling Konfiguration:

<bean id="MyBean" class="MyBeanImplementation"> 

// Beispiel Klasse

public class MyBeanImplementation implements EventListener { 

    @override 
    public processEvent(Event event) throws EventProcessFailureException { 
     try { 
      // Validate event 
      validateEvent(event); 
      // Call another service to store part of information from this event 
      // This service takes some time to return success 
      boolean success = makeCallToServiceAndStoreInfo(event); 
      if(!success) { 
       throw new EventProcessFailureException("Error storing event information!"); 
      } 
     } catch (Exception e) { 
      throw new EventProcessFailureException(e); 
     } 
    } 

} 


Dank

Antwort

0

Grundsätzlich können Sie Strategy pattern verwenden einführen verschiedene Zuhörer, die in einem di agieren verschiedene Wege zu einer gemeinsamen Veranstaltung.

<bean id="strategy1Listener" /> 
<bean id="strategy2Listener" /> 
<bean id="strategy3Listener" /> 

Dann können Sie einen Verbund Zuhörer vorstellen durch andere Zuhörer zu durchlaufen und die Veranstaltung durchlaufen und es ihnen ermöglichen, das Ereignis zu verarbeiten:

<bean id="compositeStrategyListener"> 
    <property name="listeners"> 
    <list> 
     <ref bean="strategy1Listener" /> 
     <ref bean="strategy2Listener" /> 
     <ref bean="strategy3Listener" /> 
    </list> 
    </property> 
</bean> 

Auf der anderen Seite der Geschichte, Sie haben ein Objekt, das/veröffentlicht die Ereignisse erzeugt:

<bean id="eventGenerator"> 
    <property name="eventListener" ref="compositeStrategyListener" /> 
</bean> 

So t, jetzt eventGenerator veröffentlicht das erzeugte Ereignis o eine compositeStrategyListner, die über die Listener iteriert und erlaubt es ihnen, das Ereignis auf ihre eigene Weise zu verarbeiten.

Sie können auch Spring Task Execution nutzen, um zu konfigurieren, wie Sie die Aufgabe der Ereignisverarbeitung ausführen müssen.

+0

Danke nobeh. Ihr erster Ansatz wird in meinem Fall nicht funktionieren, da eine andere Event-Listener-Implementierung nicht notwendig ist. Aber der zweite Ansatz, Spring-Aufgaben zu verwenden, scheint in meinem Anwendungsfall gut zu sein. Ich werde Task Executor versuchen und sehen, ob das für mich funktioniert. – AndyT

0

Warum nicht Google Guava Eventbus-Bibliothek mit Feder zusammen verwenden? Es kümmert sich um alles, was für das Hören von Ereignissen benötigt wird.