- 浏览: 771982 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Fanatic357:
同问,请问这个 曲线 是用什么工具 监测得到的?
RocketMQ性能压测分析 -
sunshine_love:
8核 16G, 单master TPS 4w+,2m-2s- ...
RocketMQ性能压测分析 -
assertmyself:
很好,,获益良多!
jstack和线程dump分析 -
zhaoxiaoxiao:
非常赞,帮助理解了问题。今天也是遇到了这样的问题
hessian序列化bug -
wjg_java:
打不开 宕机了
博客停止更新
很久以前写了基于rmi的分布式java程序,现在基本都忘记了,只有一个大概印象。今天写了个小例子复习了下,比较简单,主要在于使自己熟悉下api和部署过程。一共有4个java文件。
TestRemote.java
import java.rmi.Remote; import java.rmi.RemoteException; public interface TestRemote extends Remote { public String add(String a, String b) throws RemoteException; public String add() throws RemoteException; }
TestRemoteImpl.java
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class TestRemoteImpl extends UnicastRemoteObject implements TestRemote { private static final long serialVersionUID = 1L; public TestRemoteImpl() throws RemoteException { super(); } public String add(String a, String b) throws RemoteException { return a + b; } public String add() throws RemoteException { return "Hello Word"; } }
Server.java
import java.rmi.Naming; public class Server { public static void main(String[] args) throws Exception { try { // 创建远程对象 TestRemote testRemote = new TestRemoteImpl(); // 奖名称绑定到对象 Naming.rebind("rmi://localhost:1099/server", testRemote); System.out.println("RMI服务器正在运行。。。。。。"); } catch (Exception e) { e.printStackTrace(); } } }
Client.java
import java.rmi.Naming; public class Client { public static void main(String args[]) { try { TestRemote s = (TestRemote) Naming.lookup("rmi://localhost:1099/server"); System.out.println(s.add()); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } }
第一步 生成stub文件
class都编译好后,要生成stub文件,我测试的时候,class编译到我的工程下的bin目录,我在bin目录下执行命令“rmic TestRemoteImpl”,rmic后面完整路径的Remote接口的实现类,如果TestRemoteImpl在包com.test里,那么命令就是“rmic com.test.TestRemoteImpl”,后面不要带上java后缀。执行完后,TestRemoteImpl.class所在的目录(就是bin目录)就会出现一个TestRemoteImpl_Stub.class文件。
第二步 准备java安全策略文件
在bin目录下新建一个名为“mypolicy”的文件,写入内容如下
grant {
permission java.security.AllPermission "", "";
};
第三步 启动rmi注册程序
在命令行下,执行命令:rmiregistry。特别要主意的是,这个命令一定要在class所在的根目录执行,比如class文件全部编译到myproject/bin目录里,那么这个命令就一定在
myproject/bin目录下执行,否则在注册远程对象的时候,就会报以下异常:
java.rmi.UnmarshalException: error unmarshalling return; nested
exception is:
java.lang.ClassNotFoundException
。。。。。。
网上有很多人碰到这个问题,这是一定要主意的。
第四步 启动rmi服务器
在bin目录下,执行"java -Djava.security.policy=mypolicy Server",主要mypolicy是上面建立的安全策略文件。如果运行正确,命令行会输出:RMI服务器正在运行。。。。。。
第五步 启动客户端验证rmi
在bin目录下,执行“java Client”,如果运行正确,命令行会输出:Hello Word
我因为粗心犯的错误
1:本来是TestRemote s = (TestRemote) Naming.lookup("rmi://localhost:1099/server");我写成了TestRemote s = (TestRemoteImpl) Naming.lookup("rmi://localhost:1099/server");
造成程序报ClassCaseException,因为lookup出来的是rmi框架自己实现了TestRemote接口的代理类,转成TestRemoteImpl当然不行。
2:在命令行下执行rmi服务器程序时,老是报ClassNotFoundException,检查了好半天,最后发现,是CLASSPATH被公司的一个工具给改写了,CLASSPATH环境变量里没有当前路径“.”,于是我在命令行里执行export $CLASSPATH=./$CLASSPATH,结果当然悲剧啊,唉,粗心阿,应该是执行export CLASSPATH=./$CLASSPATH。
3:接着是rmiregistery,linux下是rmiregistery,而windows下是start rmiregistery,而我在linux下,一开始就输入命令start rmiregistery
4:java安全问题
默认情况下,rmi在服务器端是被java安全策略限制的,要解决这个问题,可以通过两种途径。一种解决方法是自己建立一个java安全策略文件,然后执行程序时带上这个参数;另一种解决方法是自己在jre的安全策略文件里加入内容:
grant {
permission java.security.AllPermission "", "";
};
5:总结
(1)勿以事小而不为,再简单的东西,知道归知道,实践归实践,实践过程中,总会碰到一些实际的问题,从而使经验得以成长。
(2)如果只是报ClassNofFoundException,那么要检查CLASSPATH环境变量是否正确。
(3)如果报以下异常:
java.rmi.UnmarshalException: error unmarshalling return; nested
exception is:
java.lang.ClassNotFoundException
那就要特别注意,这是因为在将远程对象注册到rmi注册管理器的时候,注册管理器找不到要绑定的对象的class信息。
如在命令行下执行:rmiregistry 那么rmi注册管理器在默认端口1099监听,在执行“ Naming.rebind("rmi://localhost:1099/server", testRemote); ”的时候,告诉rmi注册管理器,我要绑定这个对象,rmi注册管理器就会寻找这个对象的class信息,但是很奇怪的是,rmi注册管理器并不关心系统的CLASSPATH,它只是在当前目录中寻找class定义,所以这是为什么要在class所在的根目录执行rmiregistry命令。
评论
期待楼主讲讲并发包下面的 东西啊!
发表评论
-
dubbo问题总结
2012-03-14 10:00 2939任何诡异的现象必然能找到问题原因,程序是不会骗人的 ... -
memcached客户端源码分析
2011-09-08 17:28 19881memcached的java客户端有好 ... -
说说单例模式
2011-05-23 11:12 3285单例模式?多么简单!也许吧,可是要通过简单的现象, ... -
jstack和线程dump分析
2011-05-12 13:48 179963一:jstack jstack命令的语法格式: js ... -
说说new Integer和Integer.valueOf
2010-11-11 15:04 6537看看这两个语句 Integer a=new Integ ... -
线程安全总结(二)
2010-11-11 12:36 5555关于线程安全总结(-)请看 http://www.iteye ... -
java线程安全总结
2010-11-09 20:48 15554最近想将java基 ... -
hadoop架构
2010-09-07 19:41 2633该文章我转自IBM开发者社区 ... -
HashMap深入分析
2010-09-03 19:36 5797java.util.HashMap是很常见的 ... -
CountDownLatch
2010-09-02 20:03 2918java的并发包真 ... -
ThreadPoolExecutor相关类的分析
2010-09-02 19:27 4556一:ThreadPoolExecutor ... -
随便说说
2010-09-01 19:29 2057这两天给系统 ... -
java内存查看与分析
2010-08-07 17:03 22389业界有很多强 ... -
java动态代理之cglib
2010-06-22 17:27 2751cglib是一个 ... -
java动态代理随笔二
2010-06-22 16:29 1835jdk的动态代 ... -
java动态代理随笔一
2010-06-22 14:49 2036先说一下java class的加载机制和与cla ... -
关于hashcode和equals
2010-04-19 14:58 3340前几天有个同事问我,String a=" ... -
建设银行对接(五)
2010-02-09 17:34 2491public static void testVerify ... -
建设银行对接(四)
2010-02-09 17:32 3032上接“建设银行对接(三)”,javaeye的文章字数限制也太少 ... -
建设银行对接(三)
2010-02-09 17:24 3404前面两章请见我的博客 对建行返回的数据进行数字签名 ...
相关推荐
Spring-RMI (RMI调用, HTTP调用) 本人测试过了
RMI远程方法调用RMI远程方法调用RMI远程方法调用RMI远程方法调用RMI远程方法调用
这个是基于C#的 RMI远程方法调用 这个是基于C#的 RMI远程方法调用这个是基于C#的 RMI远程方法调用
RMI采用JRMP(Java Remote Method Protocol)通讯协议,是构建在TCP/IP协议上的一种远程调用方法。它允许运行在一个Java虚拟机上的对象调用运行在另一个Java虚拟机上的对象方法,从而使编程人员可以方便地在网络环境...
rmi调用架构设计
最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程
本文档主要讲述的是Java 远程方法调用RMI参数详解;根据RMI参数意义,可以归结为以下几点,我们可以根据这几点通过优化GC, 网络等待,流传输协议(http/rmi special socket)等方面来优化RMI。
RMI简单远程调用,实现数字相加!代码简单易懂
xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务,使用RMI调用JMX服务的详细过程,完整的eclipse工程,直接导入即可用。还用一些运行截图,很有用。 自己写的例子,类名是BaseExample 和RMITest.
rmi 远程方法调用 客户端
用JAVA程序实现RMI,实现客户端和服务器间的时间同步,并计算出两端的时间差
RMI是Remote Method Invocation(远程方法调用)的 所写。它允许一个Java程序调用网络中另一台计算机上的Java方法,就如调用本机的方法一样。实现RMI调用的程序和被调用的方法,都必须是Java代码,即客户端和服务器...
用java的rmi实现的 远程调用。希望对阁下有用
RMI远程调用,之前做的Demo希望对大家有所帮助!
rmi远程调用读取文件,以及各种简单的例子
实现java RMI 远程调用,包括 RMIServer RMIClient源码,测试用例。
NULL 博文链接:https://buralin.iteye.com/blog/1389172
有很多关于rmi的调用说明,在最后的运行时总是不太详细,通过多方查阅,写了一段代码,供大家参考,希望对大家有帮助。
spring RMI 远程接口调用 包含服务端客户端程序,可完整运行
JAVA RMI远程调用方法代码 RMI 远程 java