✎
编程开发网
首页
C语言
C++
面试
Linux
函数
Windows
数据库
下载
搜索
当前位置:
首页
->
AI编程基础
->
JAVA
Spring框架学习[Spring RMI实现远程调用](四)
2014-11-24 03:00:32
·
作者:
·
浏览:
6
标签:
Spring
框架
学习
RMI
实现
远程
调用
odInvocation)); } }
public class RmiClientInterceptor extends RemoteInvocationBasedAccessor implements MethodInterceptor { //在Spring启动时查找远程调用stub private boolean lookupStubOnStartup = true; //对查找到或使用过的远程调用stub进行缓存 private boolean cacheStub = true; //当连接失败是是否刷新远程调用stub private boolean refreshStubOnConnectFailure = false; //RMI客户端socket工厂 private RMIClientSocketFactory registryClientSocketFactory; //缓存的远程调用stub private Remote cachedStub; //创建远程调用stub监控器 private final Object stubMonitor = new Object();//设置是否启动时查找RMI stub public void setLookupStubOnStartup(boolean lookupStubOnStartup) { this.lookupStubOnStartup = lookupStubOnStartup; } //设置是否缓存以查找的RMI stub public void setCacheStub(boolean cacheStub) { this.cacheStub = cacheStub; } //设置当连接失败时,是否刷新RMI stub public void setRefreshStubOnConnectFailure(boolean refreshStubOnConnectFailure) { this.refreshStubOnConnectFailure = refreshStubOnConnectFailure; } //设置客户端socket工厂 public void setRegistryClientSocketFactory(RMIClientSocketFactory registryClientSocketFactory) { this.registryClientSocketFactory = registryClientSocketFactory; }//Spring IoC容器回调方法,由子类RmiProxyFactoryBean回调方法调用 public void afterPropertiesSet() { //调用父类RemoteInvocationBasedAccessor的回调方法 super.afterPropertiesSet(); prepare(); } //初始化RMI客户端 public void prepare() throws RemoteLookupFailureException { //如果设置了启动时查找RMI stub if (this.lookupStubOnStartup) { //查找RMI stub Remote remoteObj = lookupStub(); if (logger.isDebugEnabled()) { //如果查找到的RMI stub是RmiInvocationHandler类型 if (remoteObj instanceof RmiInvocationHandler) { logger.debug("RMI stub [" + getServi
ceUrl() + "] is an RMI invoker"); } //如果获取到客户端配置的serviceInterface不为null else if (getServiceInterface() != null) { //判断客户端配置的serviceInterface是否是RMI stub实例 boolean isImpl = getServiceInterface().isInstance(remoteObj); logger.debug("Using service interface [" + getServiceInterface().getName() + "] for RMI stub [" + getServiceUrl() + "] - " + (!isImpl "not " : "") + "directly implemented"); } } //如果设置了缓存RMI stub,将缓存的stub设置为查找到的RMI stub if (this.cacheStub) { this.cachedStub = remoteObj; } } } //查找RMI stub protected Remote lookupStub() throws RemoteLookupFailureException { try { Remote stub = null; //如果设置了客户端socket工厂 if (this.registryClientSocketFactory != null) { //获取并解析客户端配置的serviceUrl URL url = new URL(null, getServiceUrl(), new DummyURLStreamHandler()); //获取客户端配置的serviceUrl协议 String protocol = url.getProtocol(); //如果客户端配置的serviceUrl中协议不为null且不是rmi if (protocol != null && !"rmi".equals(protocol)) { throw new MalformedURLException("Invalid URL scheme '" + protocol + "'"); } //获取客户端配置的serviceUrl中的主机地址 String host = url.getHost(); //获取客户端配置的serviceUrl中的端口 int port = url.getPort(); //获取客户端配置的serviceUrl中请求路径 String name = url.getPath(); //如果请求路径不为null,且请求路径以”/”开头,则去掉”/” if (name != null && name.startsWith("/")) { name = name.substring(1); } //根据客户端配置的serviceUrl信息和客户端socket工厂创建远程对//象引用 Registry registry = LocateRegistry.getRegistry(host, port, this.registryClientSocketFactory); //通过远程对象引用查找指定RMI请求的RMI stub stub = registry.lookup(name); } //如果客户端配置的s
首页
上一页
1
2
3
4
5
6
7
下一页
尾页
4
/11/11