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.UnitStartedCallbackInterface; 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(UnitStartedCallbackInterface 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(UnitStartedCallbackInterface callback) { } public static boolean isStarted() { return started; } public RmiUnitAdapter getAdapter() { return adapter; } }