spring实现远程监听

来源:互联网 发布:吉他歌曲教学软件 编辑:程序博客网 时间:2024/06/16 16:58
近期项目需要集群,缓存集群是自己实现的,需要在缓存发生变动后,需要发生消息给各个节点更新缓存。所以就做了个远程监听功能。远程监听用rmi协议,事件发布前都动态查询出活动的节点,事件发布后会被活动节点上的listener监听到。上代码
1.定义event和listener
Java代码  收藏代码
  1. public class  BaseEvent  extends EventObject {  
  2.   
  3.   
  4.     private static final long serialVersionUID = 1L;  
  5.       
  6.       
  7.     /** System time when the event happened */  
  8.     private final long timestamp;  
  9.       
  10.   
  11.     public BaseEvent(Object source) {  
  12.         super(source);  
  13.         this.timestamp = System.currentTimeMillis();  
  14.           
  15.     }  
  16.       
  17.     /** 
  18.      * Return the system time in milliseconds when the event happened. 
  19.      */  
  20.     public final long getTimestamp() {  
  21.         return this.timestamp;  
  22.     }  
  23. }  

Java代码  收藏代码
  1. public interface EventLisenter<T extends BaseEvent>{  
  2.   
  3.     /** 
  4.      * 事件处理 
  5.      * @param baseEvent 
  6.      */  
  7.     void onEvent(T t);  
  8. }  

2、定义远程监听配置
Java代码  收藏代码
  1. public  class RemoteLisenter{  
  2.       
  3.     private  Class  eventClass;  
  4.       
  5.     private Class serviceInterface;  
  6.       
  7.     private String serviceName;  
  8.       
  9.     private String  registryPort;  
  10.   
  11.     public Class getServiceInterface() {  
  12.         return serviceInterface;  
  13.     }  
  14.   
  15.     public void setServiceInterface(Class serviceInterface) {  
  16.         this.serviceInterface = serviceInterface;  
  17.     }  
  18.   
  19.     public String getServiceName() {  
  20.         return serviceName;  
  21.     }  
  22.   
  23.     public void setServiceName(String serviceName) {  
  24.         this.serviceName = serviceName;  
  25.     }  


监听管理类,用于事件注册,更新远程监听,发布事件
Java代码  收藏代码
  1. public class RemoteLisenterConfig {  
  2.   
  3.     private List<RemoteLisenter> remoteLisenters =new ArrayList<RemoteLisenter>();  
  4.       
  5.       
  6.     public List<RemoteLisenter> getRemoteLisenters() {  
  7.         return remoteLisenters;  
  8.     }  
  9.   
  10.   
  11.     public void setRemoteLisenters(List<RemoteLisenter> remoteLisenters) {  
  12.         this.remoteLisenters = remoteLisenters;  
  13.     }  
  14.   
  15. }  


Java代码  收藏代码
  1. @Service  
  2. public class ListennerManagement {  
  3.   
  4.       
  5.     protected Logger logger = Logger.getLogger(getClass());  
  6.   
  7.       
  8.     @Autowired  
  9.     private HeartbeatService heartbeatService;  
  10.       
  11.       
  12.     @Autowired  
  13.     RemoteLisenterConfig remoteLisenterConfig;  
  14.       
  15.       
  16.       
  17.       
  18.   
  19.     /** 
  20.      * 本地监听 
  21.      */  
  22.     private  Map<String, List<EventLisenter>> localListeners = new LinkedHashMap<String, List<EventLisenter>>();  
  23.       
  24.     /** 
  25.      * 远程监听 
  26.      */  
  27.     private  Map<String, List<EventLisenter>> remoteListeners = new LinkedHashMap<String, List<EventLisenter>>();  
  28.   
  29.       
  30.   
  31.     /** 
  32.      * 扫瞄所有bean,进行队本地事件进行事件监听 
  33.      *  
  34.      * @throws Exception 
  35.      */  
  36.     @SuppressWarnings("rawtypes")  
  37.     public  void registryListener(ApplicationContext  ctx) throws Exception {  
  38.         // 取得容器中所有监听  
  39.         Map<String, EventLisenter> beans = ctx  
  40.                 .getBeansOfType(EventLisenter.class);  
  41.         if (beans == null || beans.size() == 0) {  
  42.             return;  
  43.         }  
  44.         Collection<EventLisenter> list = beans.values();  
  45.         for (EventLisenter listener : list) {  
  46.             Class listenercls = AopTargetUtils.getTarget(listener).getClass();  
  47.             Class eventCls = GenericTypeResolver.resolveTypeArgument(  
  48.                     listenercls, EventLisenter.class);  
  49.   
  50.             try {  
  51.                 if (localListeners.containsKey(eventCls.getName())) {  
  52.                     localListeners.get(eventCls.getName()).add(listener);  
  53.                 } else {  
  54.                     List<EventLisenter> l = new ArrayList<EventLisenter>();  
  55.                     l.add(listener);  
  56.                     localListeners.put(eventCls.getName(), l);  
  57.                 }  
  58.             } catch (Exception e) {  
  59.                 throw new Exception("初始化事件监听器时出错:", e);  
  60.             }  
  61.         }  
  62.   
  63.     }  
  64.   
  65.       
  66.      private void refreshRemoteListeners(){  
  67.         //查询出集群服务器的IP(此处从数据库配置中查询)  
  68.         List<String> ipList=heartbeatService.getAliveHostsExcludeSelf();  
  69.         List<RemoteLisenter>  RemoteLisenterList=remoteLisenterConfig.getRemoteLisenters();  
  70.         remoteListeners = new LinkedHashMap<String, List<EventLisenter>>();  
  71.         if(RemoteLisenterList!=null){  
  72.             for (RemoteLisenter remoteLisenter : RemoteLisenterList) {  
  73.                   
  74.                 String eventClsName=remoteLisenter.getEventClass().getName();  
  75.                 Class listenerCls=remoteLisenter.getServiceInterface();  
  76.                 String port=remoteLisenter.getRegistryPort();  
  77.                 String serviceName=remoteLisenter.getServiceName();  
  78.                 if(ipList!=null){  
  79.                     for (String ip : ipList) {  
  80.                         EhCacheService ehCacheService=null;  
  81.                         EventLisenter listener = buildRemotListener(listenerCls, port,serviceName, ip);  
  82.                           
  83.                         if(listener!=null){  
  84.                             if (remoteListeners.containsKey(eventClsName)) {  
  85.                                 remoteListeners.get(eventClsName).add(listener);  
  86.                             } else {  
  87.                                 List<EventLisenter> l = new ArrayList<EventLisenter>();  
  88.                                 l.add(listener);  
  89.                                 remoteListeners.put(eventClsName, l);  
  90.                             }  
  91.                         }  
  92.                     }  
  93.                 }  
  94.               
  95.         }  
  96.               
  97.               
  98.               
  99.         }  
  100.     }  
  101.   
  102.   
  103.     private EventLisenter buildRemotListener(Class listenerCls, String port,  
  104.             String serviceName, String ip) {  
  105.           
  106.         try {  
  107.             RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();  
  108.             rmiProxyFactoryBean.setServiceInterface(listenerCls);   
  109.             rmiProxyFactoryBean.setServiceUrl("rmi://"+ip+":"+port+"/"+serviceName);  
  110.             rmiProxyFactoryBean.afterPropertiesSet();  
  111.               
  112.             if (rmiProxyFactoryBean.getObject() instanceof EventLisenter) {   
  113.                 EventLisenter  listener=(EventLisenter)rmiProxyFactoryBean.getObject();  
  114.                 return listener;  
  115.             }else{  
  116.                 return null;  
  117.             }  
  118.         } catch (Exception e) {  
  119.             logger.error("获取远程监听bean错误[listenerClass="+listenerCls+";port="+port+";ip="+ip+";serviceName="+serviceName+"]", e);  
  120.             return null;  
  121.         }  
  122.           
  123.           
  124.           
  125.   
  126.           
  127.     }  
  128.       
  129.       
  130.     /** 
  131.      * 发布事件 
  132.      *  
  133.      * @throws Exception 
  134.      */  
  135.     @SuppressWarnings("rawtypes")  
  136.     public  void publishEvent(BaseEvent event)  {  
  137.         //本地监控  
  138.         List<EventLisenter> localList = localListeners.get(event.getClass().getName());  
  139.         if (localList != null) {  
  140.             for (EventLisenter listener : localList) {  
  141.                 try {  
  142.                     listener.onEvent(event);  
  143.                 } catch (Exception e) {  
  144.                     logger.error(e.getMessage());  
  145.                 }  
  146.             }  
  147.         }  
  148.           
  149.         //远程监控  
  150.         Class eventClass=event.getClass();  
  151.         if(needRemoteListenre(eventClass)){  
  152.             //刷新远程监听者  
  153.             refreshRemoteListeners();  
  154.               
  155.             List<EventLisenter> remoteList = remoteListeners.get(event.getClass().getName());  
  156.             if (remoteList != null) {  
  157.                 for (EventLisenter listener : remoteList) {  
  158.                     try {  
  159.                         listener.onEvent(event);  
  160.                     } catch (Exception e) {  
  161.                         logger.error(e.getMessage());  
  162.                     }  
  163.                 }  
  164.             }  
  165.         }  
  166.     }  
  167.   
  168.   
  169.     /** 
  170.      * 判断本事件是否需要远程监听 
  171.      * @param eventClass 
  172.      * @return 
  173.      */  
  174.     private boolean needRemoteListenre(Class eventClass) {  
  175.           
  176.         List<RemoteLisenter>  RemoteLisenterList=remoteLisenterConfig.getRemoteLisenters();  
  177.         if(RemoteLisenterList!=null){  
  178.             for (RemoteLisenter remoteLisenter : RemoteLisenterList) {            
  179.                  Class eventCls=remoteLisenter.getEventClass();  
  180.                  if(eventCls.equals(eventCls))  
  181.                      return true;  
  182.             }  
  183.         }  
  184.         return false;     
  185.               
  186.     }  
  187.   
  188.   
  189.     public Map<String, List<EventLisenter>> getLocalListeners() {  
  190.         return localListeners;  
  191.     }  
  192.   
  193.   
  194.     public Map<String, List<EventLisenter>> getRemoteListeners() {  
  195.         return remoteListeners;  
  196.     }  
  197.       


配置文件
Java代码  收藏代码
  1. <!-- 配置远程监听配置对象 -->  
  2.     <bean id="remoteLisenterConfig"  class="com.ejintai.cbs_policy_registry.base.event.RemoteLisenterConfig">  
  3.       <property name="remoteLisenters">  
  4.          <list>  
  5.          <bean id="remoteLisenter1"  class="com.ejintai.cbs_policy_registry.base.event.RemoteLisenter">  
  6.               <property name="eventClass"      value="com.ejintai.cbs_policy_registry.base.event.biz.EhCacheUpdateEvent" />    
  7.               <property name="serviceName"         value="ehCacheUpdateEventListener" />    
  8.               <property name="serviceInterface"    value="com.ejintai.cbs_policy_registry.base.event.EventLisenter"/>    
  9.               <property name="registryPort"        value="${rmi.port}"/>    
  10.           </bean>  
  11.          </list>  
  12.       </property>  
  13.     </bean>  
  14.   
  15.  <bean id="remoteEhCacheUpdateEventListener" class="org.springframework.remoting.rmi.RmiServiceExporter" >    
  16.         <property name="serviceName"         value="ehCacheUpdateEventListener" />    
  17.         <property name="service"             ref="ehCacheUpdateEventListener"/>    
  18.         <property name="serviceInterface"    value="com.ejintai.cbs_policy_registry.base.event.EventLisenter"/>    
  19.         <property name="registryPort"        value="${rmi.port}"/>    
  20.     </bean> 
原创粉丝点击