2012-03-30 72 views
0

我正在實現一個監聽器類,它偵聽一些事件然後處理它們。如果此事件的處理進行得順利,則不會再次通知此事件,但是如果發生任何異常事件,將在一段時間後再次通知給MyBeanImplementation類,並且可以再次嘗試處理它。一個bean的多個實例

下面的代碼工作正常,但由於此事件處理可能需要一些時間,
1.我想擁有多個偵聽器。
2.限制服務的調用次數,可能是使用線程池。

如何讓多個偵聽器以不同的方式處理每個事件?我對Spring很陌生,如果這甚至可能,我也不知道。

繼承人是一個例子:

// Spring配置文件:

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

//樣例類

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); 
     } 
    } 

} 


感謝

回答

0

基本上,你可以使用Strategy pattern介紹不同的聽衆可以在di中重新採取行動通往共同事件的不同方式。

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

然後,您可以引入一個複合聽衆通過其他聽衆迭代,並通過活動,讓他們來處理該事件:

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

在故事的另一面,你已經生成/對象發佈的事件:

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

所以,現在eventGenerator發佈生成的事件ŧ一個compositeStrategyListner,它遍歷它擁有的監聽器,並允許它們以不同的方式處理事件。

您還可以利用Spring Task Execution來配置您需要如何運行事件處理任務。

+0

謝謝nobeh。你的第一種方法不適用於我的情況,因爲不需要實現不同的事件監聽器。但使用Spring任務執行的第二種方法在我的用例中看起來很好。我會嘗試執行任務,看看是否適合我。 – AndyT 2012-03-31 02:21:45

0

爲什麼不用彈簧一起使用谷歌番石榴eventbus庫?它將處理收聽事件所需的每件事情。