2012-03-30 74 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库?它将处理收听事件所需的每件事情。