一个基于RMI的小巧好用的框架
2013-02-24 19:25
176 查看
最近有用到rmi技术,需要实现Remote接口,需要抛出RemoteException异常,极其不爽,遂封装之,封装之后只需普通
POJO对象即可!
该框架核心有三个类,一个服务端类RMIEndpoint,一个客户端类RMIProxyFactory,一个通用接口GenericRmiService
先看一下用法:
服务端用法:
Java代码
RMIEndpoint.addService(User.class,
new UserImpl());
try {
RMIEndpoint.publish(8888);
} catch (Exception e) {
e.printStackTrace();
}
客户端用法:
Java代码
try {
User user = RMIProxyFactory.getProxy(User.class,
"localhost", 8888);
System.out.println(user.say("11111"));
System.out.println(user.say("11111"));
System.out.println(user.say("11111"));
} catch (Exception e) {
e.printStackTrace();
}
用起来简单吧!User是普通的接口,UserImpl是普通的POJO对象.
下面来看看三个核心类内部。
服务端点类:
Java代码
package com.yuan.common.rmi;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.yuan.common.util.ReflectUtil;
public class RMIEndpoint {
private static
final Logger LOG = LoggerFactory.getLogger(RMIEndpoint.class);
private static ConcurrentMap<String, Object> serviceMap =
new ConcurrentHashMap<String, Object>();
private static String HOSTNAME;
public static
void addService(Object service){
serviceMap.put(service.getClass().getName(), service);
}
public static
void addService(Class<?> iface, Object service){
serviceMap.put(iface.getName(), service);
}
/**
* 服务端多个IP则必须设置
* @param hostName
*/
public static
void setHostName(String hostName){
System.setProperty("java.rmi.server.hostname" , hostName);
HOSTNAME = hostName;
}
public static
void publish() throws RemoteException, MalformedURLException, UnknownHostException{
publish(1099);
}
public static
void publish(int port)
throws RemoteException, MalformedURLException, UnknownHostException{
LocateRegistry.createRegistry(port); //注册端口
GenericRmiService rmiService = new GenericRmiService(){
private static
final long serialVersionUID = 1L;
public Object doService(String serviceName, String methodName, Object[] args)
throws RemoteException {
if(serviceMap.containsKey(serviceName)){
Object service = serviceMap.get(serviceName);
try {
return ReflectUtil.execMethod(service, methodName, args);
} catch (Exception e) {
LOG.warn(e.getMessage(), e);
throw new RemoteException(e.getMessage(), e);
}
}
LOG.warn("RMI服务" + serviceName +
"不存在!");
throw new RemoteException("RMI服务" + serviceName +
"不存在!");
}
};
UnicastRemoteObject.exportObject(rmiService, 0);
//随机通信端口
if(HOSTNAME == null){
HOSTNAME = InetAddress.getLocalHost().getHostAddress();
}
Naming.rebind("rmi://"+HOSTNAME+":"+port+"/GenericRmiService", rmiService);
}
}
POJO对象即可!
该框架核心有三个类,一个服务端类RMIEndpoint,一个客户端类RMIProxyFactory,一个通用接口GenericRmiService
先看一下用法:
服务端用法:
Java代码
RMIEndpoint.addService(User.class,
new UserImpl());
try {
RMIEndpoint.publish(8888);
} catch (Exception e) {
e.printStackTrace();
}
RMIEndpoint.addService(User.class, new UserImpl()); try { RMIEndpoint.publish(8888); } catch (Exception e) { e.printStackTrace(); }
客户端用法:
Java代码
try {
User user = RMIProxyFactory.getProxy(User.class,
"localhost", 8888);
System.out.println(user.say("11111"));
System.out.println(user.say("11111"));
System.out.println(user.say("11111"));
} catch (Exception e) {
e.printStackTrace();
}
try { User user = RMIProxyFactory.getProxy(User.class, "localhost", 8888); System.out.println(user.say("11111")); System.out.println(user.say("11111")); System.out.println(user.say("11111")); } catch (Exception e) { e.printStackTrace(); }
用起来简单吧!User是普通的接口,UserImpl是普通的POJO对象.
下面来看看三个核心类内部。
服务端点类:
Java代码
package com.yuan.common.rmi;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.yuan.common.util.ReflectUtil;
public class RMIEndpoint {
private static
final Logger LOG = LoggerFactory.getLogger(RMIEndpoint.class);
private static ConcurrentMap<String, Object> serviceMap =
new ConcurrentHashMap<String, Object>();
private static String HOSTNAME;
public static
void addService(Object service){
serviceMap.put(service.getClass().getName(), service);
}
public static
void addService(Class<?> iface, Object service){
serviceMap.put(iface.getName(), service);
}
/**
* 服务端多个IP则必须设置
* @param hostName
*/
public static
void setHostName(String hostName){
System.setProperty("java.rmi.server.hostname" , hostName);
HOSTNAME = hostName;
}
public static
void publish() throws RemoteException, MalformedURLException, UnknownHostException{
publish(1099);
}
public static
void publish(int port)
throws RemoteException, MalformedURLException, UnknownHostException{
LocateRegistry.createRegistry(port); //注册端口
GenericRmiService rmiService = new GenericRmiService(){
private static
final long serialVersionUID = 1L;
public Object doService(String serviceName, String methodName, Object[] args)
throws RemoteException {
if(serviceMap.containsKey(serviceName)){
Object service = serviceMap.get(serviceName);
try {
return ReflectUtil.execMethod(service, methodName, args);
} catch (Exception e) {
LOG.warn(e.getMessage(), e);
throw new RemoteException(e.getMessage(), e);
}
}
LOG.warn("RMI服务" + serviceName +
"不存在!");
throw new RemoteException("RMI服务" + serviceName +
"不存在!");
}
};
UnicastRemoteObject.exportObject(rmiService, 0);
//随机通信端口
if(HOSTNAME == null){
HOSTNAME = InetAddress.getLocalHost().getHostAddress();
}
Naming.rebind("rmi://"+HOSTNAME+":"+port+"/GenericRmiService", rmiService);
}
}
package com.yuan.common.rmi; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.UnknownHostException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.server.UnicastRemoteObject; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.yuan.common.util.ReflectUtil; public class RMIEndpoint { private static final Logger LOG = LoggerFactory.getLogger(RMIEndpoint.class); private static ConcurrentMap<String, Object> serviceMap = new ConcurrentHashMap<String, Object>(); private static String HOSTNAME; public static void addService(Object service){ serviceMap.put(service.getClass().getName(), service); } public static void addService(Class<?> iface, Object service){ serviceMap.put(iface.getName(), service); } /** * 服务端多个IP则必须设置 * @param hostName */ public static void setHostName(String hostName){ System.setProperty("java.rmi.server.hostname" , hostName); HOSTNAME = hostName; } public static void publish() throws RemoteException, MalformedURLException, UnknownHostException{ publish(1099); } public static void publish(int port) throws RemoteException, MalformedURLException, UnknownHostException{ LocateRegistry.createRegistry(port); //注册端口 GenericRmiService rmiService = new GenericRmiService(){ private static final long serialVersionUID = 1L; public Object doService(String serviceName, String methodName, Object[] args) throws RemoteException { if(serviceMap.containsKey(serviceName)){ Object service = serviceMap.get(serviceName); try { return ReflectUtil.execMethod(service, methodName, args); } catch (Exception e) { LOG.warn(e.getMessage(), e); throw new RemoteException(e.getMessage(), e); } } LOG.warn("RMI服务" + serviceName + "不存在!"); throw new RemoteException("RMI服务" + serviceName + "不存在!"); } }; UnicastRemoteObject.exportObject(rmiService, 0); //随机通信端口 if(HOSTNAME == null){ HOSTNAME = InetAddress.getLocalHost().getHostAddress(); } Naming.rebind("rmi://"+HOSTNAME+":"+port+"/GenericRmiService", rmiService); } }
相关文章推荐
- 一个基于RMI的小巧好用的框架(三)
- 一个基于RMI的小巧好用的框架(三)
- 手把手教你写一个基于RxJava的扩展框架
- 基于ACE Proactor框架下高并发、大容量吞吐程序设计既最近的一个产品开发总结
- ACE框架简介以及一个基于ACE的C/S服务程序实例
- 手把手教你写一个基于RxJava的扩展框架
- 基于strut2的一个登录验证框架示例
- 一个专为移动端开发的原创即时通讯框架,超轻量级、高度提炼,完全基于UDP协议,支持iOS、Android、标准Java平台。
- 基于AndroidAnnotation扩展的一个异步调用框架
- 一个基于装饰者设计模式的上报框架
- 一个自己开发的简单,快速,方便,小巧的php web框架
- 分享一个基于Bootstrap的 ACE框架 入门(MVC+EF)
- 一个基于JUnit的测试框架
- 自己撸一个基于运行时注解的简单IOC框架
- 基于ACE设计一个c++网络游戏服务器框架引擎
- SPServer : 一个基于线程池(包括HAHS和LF)的高并发 server 框架
- 分享一个基于jQuery,backbone.js和underscore.js的消息提示框架 - Backbone.Notifier
- jphone项目设计介绍(一个基于C++的应用程序框架以及软电话和日志服务器应用)
- SPServer : 一个基于线程池(包括HAHS和LF)的高并发 server 框架
- 用intellij idea创建一个基于Vert.x框架的http服务器程序