| package com.dy.common.mw.channel.rmi; | 
|   | 
| import java.io.IOException; | 
| import java.rmi.registry.LocateRegistry; | 
| import java.rmi.registry.Registry; | 
| import java.rmi.server.UnicastRemoteObject; | 
|   | 
| import com.dy.common.mw.UnitAdapterInterface; | 
| import com.dy.common.mw.UnitInterface; | 
| import com.dy.common.mw.UnitCallbackInterface; | 
|   | 
| public class RmiUnit implements UnitInterface { | 
|      | 
|     private static RmiUnit instance = new RmiUnit() ; | 
|     private static boolean started = false ; | 
|      | 
|     private static RmiUnitAdapter adapter ; | 
|      | 
|     private static RmiFrameWork rmiFrm = null ; | 
|   | 
|      | 
|     private RmiUnit(){} | 
|      | 
|     public static RmiUnit getInstance(){ | 
|         return instance ; | 
|     } | 
|      | 
|      | 
|     @Override | 
|     public void setAdapter(UnitAdapterInterface adapter) throws Exception { | 
|         if(adapter == null){ | 
|             throw new Exception("Rmi模块适配器对象不能为空!") ; | 
|         } | 
|         RmiUnit.adapter = (RmiUnitAdapter)adapter ;  | 
|         RmiConfigVo vo = RmiUnit.adapter.getConfig() ; | 
|         if(vo == null){ | 
|             throw new Exception("Rmi模块属性配置对象不能为空!") ; | 
|         } | 
|         if(vo.port == null){ | 
|             throw new Exception("Rmi模块port属性值不能为空!") ; | 
|         } | 
|         if(vo.context == null || vo.context.trim().equals("")){ | 
|             throw new Exception("Rmi模块context属性值不能为空!") ; | 
|         } | 
|     } | 
|     /** | 
|      * 启动模块 | 
|      */ | 
|     public void start(UnitCallbackInterface callback) throws Exception { | 
|         if(!started){ | 
|             started = true ; | 
|   | 
|             RmiConfigVo vo = RmiUnit.adapter.getConfig() ; | 
|              | 
|             boolean isException = false ; | 
|             try { | 
|                  | 
|                 //改局域变量为静态全局变量,防止局域变量在无引用时被垃圾回收,从而客户端得不到RMI服务端 | 
|                 if(rmiFrm == null){ | 
|                     rmiFrm = new RmiFrameWorkImpl(RmiUnit.adapter); | 
|                 } | 
|                  | 
|                 //连接到本地JNDI | 
|                 Registry registry = LocateRegistry.createRegistry(vo.port); | 
|   | 
|                 //解除注册 | 
|                 UnicastRemoteObject.unexportObject(rmiFrm, true); | 
|   | 
|                 //注册 | 
|                 registry.bind(vo.context, UnicastRemoteObject.exportObject(rmiFrm, 0)); | 
|                  | 
|             } catch (IOException e) { | 
|                 e.printStackTrace(); | 
|                 System.out.println("Rmi通信模块启动失败!"); | 
|                 isException = true ; | 
|             } | 
|   | 
|             if(!isException){ | 
|                 if(vo.showStartInfo != null && vo.showStartInfo){ | 
|                     System.out.println("Rmi模块成功启动,端口:" + vo.port + ",上下文为:" + vo.context ); | 
|                 } | 
|             } | 
|             callback.call(null); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public void stop(UnitCallbackInterface callback) { | 
|     } | 
|      | 
|   | 
|     public static boolean isStarted() { | 
|         return started; | 
|     } | 
|   | 
|     public RmiUnitAdapter getAdapter() { | 
|         return adapter; | 
|     } | 
|   | 
|      | 
| } |