package com.jqmobile.core.server.rmi; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.sql.Connection; import com.jqmobile.core.server.rmi.test.IRMITest; import com.jqmobile.core.server.rmi.test.RMIDirectSocketFactory; import com.jqmobile.core.server.rmi.test.User; import com.jqmobile.core.server.service.ServiceFactory; /** * <p>2014-4-1废弃,后续请使用com.jqmobile.core.server.rmi2.RemoteServiceFactory</p> * <p>接口最后有效期为2014-12 * * <p>Copyright: 版权所有 (c) 2002 - 2015<br> * Company: 久其</p> * * @author modi qq:411051729 * @version 2014年4月1日 */ @Deprecated public class RemoteServiceFactory extends ServiceFactory{ private final static RMIDirectSocketFactory rmiFactory = new RMIDirectSocketFactory(); public static void main(String[] args) { // RemoteManagerFactory.setRemoteIp("10.2.5.86"); IRMITest r = RemoteServiceFactory.instance(IRMITest.class); User u = r.login("userName", "password"); System.out.println(u); } private final static RemoteServiceFactory mf = new RemoteServiceFactory(); private String session;//远程相应回话机制 private String remoteIp="127.0.0.1"; private Integer remotePort=9700; private String username; private String password; private RemoteServiceFactory(){ } public RemoteServiceFactory(String ip){ this(ip, 9700); } public RemoteServiceFactory(String ip, int port){ this.remoteIp = ip; this.remotePort = port; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public String getSession() { return session; } /** * 实例化Manager * @param c * @return */ public static <T> T instance(Class<T> c){ return mf.instanceService(c); } public static void setRemoteIp(String remoteIp) { mf.remoteIp = remoteIp; } public static void setRemotePort(int remotePort) { mf.remotePort = remotePort; } public static void setUserName(String username){ mf.setUsername(username); } public static void setPassWord(String password){ mf.setPassword(password); } //============================================================= @Override protected InvocationHandler getInvocationHandler(Class<?> c) { return new RemoteBaseInvocationHandler(c, this); } @Override public Connection newConnection() { return null; } //============================================================= static final class RemoteBaseInvocationHandler implements InvocationHandler{ private Class<?> c; private RemoteServiceFactory f; RemoteBaseInvocationHandler(Class<?> c, RemoteServiceFactory remoteManagerFactory){ this.c=c; this.f = remoteManagerFactory; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String ip = f.remoteIp;//==null?"127.0.0.1":f.remoteIp; int port = f.remotePort;//==null?9700:f.remotePort; Registry r = LocateRegistry.getRegistry(ip, port, rmiFactory); Remote remote = r.lookup(IRmiRemote.class.getName()); L1: if(remote instanceof IRmiRemote){ if(null == f.session){ f.session = login((IRmiRemote)remote); } IRmiRemote mf = (IRmiRemote)remote; RmiRemote rmi = new RmiRemote(); rmi.setManagerClass(c.getName()); rmi.setMethod(method.getName()); rmi.setArgs(args); rmi.setSession(f.session); try { return mf.invoke(rmi); } catch (Throwable e) { Throwable e1 = e; int i=6; while(null != e1 && !(e1 instanceof RmiException) && i-->0){ e1 = e1.getCause(); } if(null != e1 && e1 instanceof RmiException){ f.session = null; int code = ((RmiException) e1).getCode(); switch (code) { case RmiException.RMI_RequestIP_Error: break; case RmiException.RMI_AboveMaxConn_Error: break; case RmiException.RMI_Password_Error: break; case RmiException.RMI_NotFoundUsername_Error: break; case RmiException.RMI_Session_Error: f.session = null; break L1; default: break; } } throw e; // e.printStackTrace(); } } throw new RemoteException("未能找到远程代理对象,请检查是否注册远程代理,远程地址或端口是否正确"); } private String login(IRmiRemote remote) throws RemoteException { RmiRemote rmi = new RmiRemote(); rmi.setManagerClass("com.jqmobile.core.server.rmi.IRmiLogin"); rmi.setMethod("login"); rmi.setArgs(f.username,f.password); return (String) remote.invoke(rmi); } } }