Spring 注入的事件监听模式

public interface EventType {
}


public interface Event {
EventType getEventType();
}


public class JointSurveySubmitEvent implements Event {


  private JointSurvey jointSurvey;


  public JointSurveySubmitEvent(JointSurvey jointSurvey) {
    this.jointSurvey = jointSurvey;
  }


  @Override
  public EventType getEventType() {
    return ScheduleEventType.SUBMIT; // 这是一个实现了EventType的枚举
  }


  public JointSurvey getJointSurvey() {
    return jointSurvey;
  }


}


public interface Listener<TEvent extends Event> {
/**

* @return the EventType(s) you are intersted in,mustn't be empty
*/
EventType[] getEventTypes();


/**
* whenever the event that you are interested in published,the method will
* be called

* @param event
*/
void handle(TEvent event);


/**
* you can override this method return true to begin a new Transaction

* or you can add "@Transactional(propagation = Propagation.REQUIRES_NEW)"
* on Listener's handle method

* @return
*/
boolean isInNewTransaction();
}






import com.jsw.common.eventbus.Event;
import com.jsw.common.eventbus.EventPublisher;
import com.jsw.common.eventbus.EventType;
import com.jsw.common.eventbus.Listener;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Service(value = "eventPublisher")
public class DefaultEventPublisher implements EventPublisher, InitializingBean {
  private final static Log log = LogFactory.getLog(DefaultEventPublisher.class);


  private final static String EVENT_LISTENER_REGISTER_MSG = "Event:{0} register,Listener:{1}";


  private final static String EVENT_PUBLISH_MSG = "Event:{0} fire";


  private final static String EVENT_LISTENER_HANDLE_MSG = "Listener:{0} handle the event:{1}";


  private Map<EventType, List<Listener<Event>>> listeners = new HashMap<EventType, List<Listener<Event>>>();


  @Autowired(required = false)
  private List<Listener<Event>> autowiredListeners = new ArrayList<Listener<Event>>();


  @Autowired
  private TransactionSupport transactionSupport;


  @Override
  public void afterPropertiesSet() throws Exception {
    for (Listener<Event> listener : autowiredListeners) {
      this.register(listener);
    }
  }


  public void publish(Event event) {
    if (log.isTraceEnabled()) {
      log.trace(MessageFormat.format(EVENT_PUBLISH_MSG, getEventTypeMsg(event.getEventType())));
    }


    List<Listener<Event>> myListeners = this.listeners.get(event.getEventType());
    if (myListeners != null) {
      for (Listener<Event> listener : myListeners) {
        if (log.isTraceEnabled()) {
          log.trace(MessageFormat.format(EVENT_LISTENER_HANDLE_MSG, listener.getClass().getCanonicalName(),
              getEventTypeMsg(event.getEventType())));
        }
        if (!listener.isInNewTransaction()) {
          listener.handle(event);
        } else {
          invokeTransactionHandlers(event, listener);
        }


      }
    }
  }


  @SuppressWarnings("rawtypes")
  public void register(Listener listener) {
    assert listener.getEventTypes() != null : "Listener's eventType(s) can't be empty";


    for (EventType eventType : listener.getEventTypes()) {
      this.register(eventType, listener);
    }
  }


  protected void invokeTransactionHandlers(final Event event, final Listener<Event> listener) {
    new Thread() {
      public void run() {
        transactionSupport.handle(listener, event);
      };
    }.start();
  }


  private String getEventTypeMsg(EventType eventType) {
    return eventType.getClass().isEnum() ? eventType + "[" + eventType.getClass().getCanonicalName() + "]" : eventType
        .getClass().getCanonicalName();
  }


  @SuppressWarnings({ "rawtypes", "unchecked" })
  private void register(EventType eventType, Listener listener) {
    if (log.isTraceEnabled()) {
      log.trace(MessageFormat.format(EVENT_LISTENER_REGISTER_MSG, getEventTypeMsg(eventType), listener.getClass()
          .getCanonicalName()));
    }


    List<Listener<Event>> myListeners = this.listeners.get(eventType);
    if (myListeners == null) {
      myListeners = new ArrayList<Listener<Event>>();
      this.listeners.put(eventType, myListeners);
    }


    myListeners.add(listener);
  }

}


//发布事件

eventPublisher.publish(new JointSurveySubmitEvent(jointSurvey));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值