package SpringRMI;
import java.lang.reflect.Method;
import java.rmi.Naming;
import java.rmi.Remote;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.factory.FactoryBean;
/*
*
客户端的相关类。在MockRmiProxyFactoryBean中,它使用MethodInterceptor拦截了所有对于导出接口方法的调用并转发给相应的stub。
如果这个stub是实现了MockRmiInvocationHandler(比如MockRmiInvocationWrapper),
那么会把所有的调用转发给MockRmiInvocationHandler的invoke方法,
同时构造一个MockRemoteInvocation。此后就是通过MockRmiInvocationWrapper_Stub进行远程调用了。
服务器端接收到请求之后,在MockRmiInvocationWrapper类中又把这个请求转发到this.rmiExporter.invoke(invocation, this.wrappedObject)。
在MockRmiServiceExporter的invoke方法中,再次转发给MockRemoteInvocation的invoke方法,
最终在MockRemoteInvocation.inovke方法中调用了targetObject上的相关方法。顺便说一下,
由于MockRemoteInvocation对象是从客户端通过序列化传递到服务器端的,
而且在这个对象中保存了客户端调用的方法名及参数列表,所以在这个对象中能最终决定应该调用targetObject上的哪个方法。
*
*/
public class MockRmiProxyFactoryBean implements FactoryBean, MethodInterceptor {
//
private Object serviceProxy;
//
private String serviceUrl;
private Class<?> serviceInterface;
public Object getObject() {
return serviceProxy;
}
@SuppressWarnings("unchecked")
public Class getObjectType() {
return getServiceInterface();
}
public boolean isSingleton() {
return true;
}
protected Remote getStub() throws Throwable {
Remote stub = Naming.lookup(getServiceUrl());
return stub;
}
public Object invoke(MethodInvocation invocation) throws Throwable {
Remote stub = null;
try {
stub = getStub();
} catch (Throwable ex) {
throw ex;
}
try {
return doInvoke(invocation, stub);
} catch (Exception ex) {
throw ex;
}
}
protected Object doInvoke(MethodInvocation mi, Remote stub) throws Throwable {
if (stub instanceof MockRmiInvocationHandler) {
// RMI invoker
try {
return doInvoke(mi, (MockRmiInvocationHandler)stub);
} catch (Exception ex) {
throw ex;
}
} else {
// traditional RMI stub
try {
Method method = mi.getMethod();
if (method.getDeclaringClass().isInstance(stub)) {
// directly implemented
return method.invoke(stub, mi.getArguments());
} else {
// not directly implemented
Method stubMethod = stub.getClass().getMethod(method.getName(), method.getParameterTypes());
return stubMethod.invoke(stub, mi.getArguments());
}
} catch (Exception ex) {
throw ex;
}
}
}
protected Object doInvoke(MethodInvocation mi, MockRmiInvocationHandler mrih) throws Throwable {
return mrih.invoke(createRemoteInvocation(mi));
}
protected MockRemoteInvocation createRemoteInvocation(MethodInvocation mi) throws Throwable {
return new MockRemoteInvocation(mi);
}
public void afterPropertiesSet() {
serviceProxy = ProxyFactory.getProxy(getServiceInterface(), this);
}
public String getServiceUrl() {
return serviceUrl;
}
public void setServiceUrl(String serviceUrl) {
this.serviceUrl = serviceUrl;
}
public Class<?> getServiceInterface() {
return serviceInterface;
}
public void setServiceInterface(Class<?> serviceInterface) {
this.serviceInterface = serviceInterface;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Rmi.rar_Java RMI_RMI java_java RMI 线程_rmi
共81个文件
class:38个
java:27个
xml:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 69 浏览量
2022-09-22
21:12:36
上传
评论
收藏 1022KB RAR 举报
温馨提示
这是总结的一系列rmi实现方式、是非常好的实例、花费了大量的心血、希望能对各位有所帮助
资源推荐
资源详情
资源评论
收起资源包目录
Rmi.rar (81个子文件)
Rmi
.myhibernatedata 547B
.settings
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.wst.jsdt.ui.superType.container 49B
.jsdtscope 500B
org.eclipse.jdt.core.prefs 330B
src
BankServer.class 1KB
rmi
CalculatorClient.java 1KB
Calculator.java 569B
CalculatorServer.java 410B
CalculatorImpl.java 863B
BankInterf.java 267B
BankImpl.java 3KB
BankImpl.class 3KB
BankInterf.class 266B
BankServer.java 1009B
Hello.class 839B
BankClient.java 2KB
Hello.java 622B
HelloIn.java 121B
rmimyql
BankServer.class 1KB
BankInterf.java 283B
BankImpl.java 3KB
BankImpl.class 3KB
BankInterf.class 274B
BankServer.java 1KB
BankClient.java 2KB
BankClient.class 2KB
Helloworld.java 475B
Helloworld.class 733B
rmiUtil
HibernateSessionFactory.java 3KB
BankClient.class 2KB
HelloIn.class 213B
hibernate.cfg.xml 869B
SpringRMI
MockProductRemote.java 204B
MockRmiServiceExporter.java 3KB
MockRmiInvocationWrapper.java 582B
MockRmiProxyFactoryBean.java 4KB
MockRemoteInvocation.java 2KB
MockRmiServer.java 1KB
MockRmiClient.java 1KB
MockProduct.java 346B
MockProductRemoteImpl.java 251B
MockRmiInvocationHandler.java 220B
MockProductImpl.java 155B
.project 1KB
WebRoot
META-INF
MANIFEST.MF 36B
WEB-INF
web.xml 371B
classes
BankServer.class 1KB
rmi
CalculatorClient.class 2KB
CalculatorServer.class 1KB
CalculatorImpl.class 837B
Calculator.class 275B
BankImpl.class 3KB
BankInterf.class 266B
Hello.class 976B
rmimyql
BankServer.class 1KB
BankImpl.class 3KB
BankInterf.class 274B
BankClient.class 2KB
Helloworld.class 875B
rmiUtil
HibernateSessionFactory.class 2KB
BankClient.class 2KB
HelloIn.class 213B
hibernate.cfg.xml 869B
SpringRMI
MockProductImpl.class 436B
MockRmiServiceExporter.class 3KB
MockRmiInvocationHandler.class 287B
MockRmiClient.class 2KB
MockRmiInvocationWrapper.class 948B
MockRmiServer.class 1KB
MockRmiProxyFactoryBean.class 4KB
MockProductRemote.class 249B
MockRemoteInvocation.class 2KB
MockProduct.class 161B
MockProductRemoteImpl.class 520B
lib
commons-logging-1.0.4.jar 37KB
mysql-connector-java-5.0.8-bin.jar 528KB
derbyclient.jar 459KB
index.jsp 834B
.mymetadata 282B
.classpath 905B
.myeclipse
共 81 条
- 1
资源评论
小贝德罗
- 粉丝: 69
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功