日志标签:rmi

RMI之NoSuchObjectException

分类:java, rmi评论:1条作者:ticmy日期:2012-09-28

最近再一次碰到RMI客户端访问RMI服务出现java.rmi.NoSuchObjectException异常,碰到两次这个异常,都是出现在生产环境中,现象很有意思,生产运行好几年也没出现过这种异常,突然某一天出现了,重启服务就OK,然后每天都要出现。原因很简单,现象很费解,要么不出现,要么天天出现,jdk1.4,1.5都有,印象中都是hotspot vm出的这个问题。 这个问题的根本原因在于RMI绑定的远程服务对象被垃圾回收掉了。看起来像是jvm的bug,不是吗?不管怎样,没法改变jvm,只能改变程序了。 通常喜欢这样绑定服务: Naming.bind(name, new Service()); 只需将new Service剥离出来,让一个静态引用持有它就好 static Service s = new Service(); ...... Naming.bind(name, s); 如此,即可避免该异常。 下载文章的PDF …
Tags:

《Java RMI》——流

分类:java, rmi评论:2条作者:ticmy日期:2012-06-30

读取字节和写入字节有两个基本的类,分别是InuputStream和OutputStream。两个类里的方法都很直接,具体含义方法及可直接参考API文档。 有个比较有趣的地方可能会让新手疑惑,在InputStream里有一个方法:public int read() throws IOException;这个方法表示读取一个字节,并返回。很多人会问,为什么返回值不是byte,而是一个int?原因在于“如果到达流的末尾,则返回 -1”。byte类型的-1的二进制补码是1111 1111,若使用byte类型作为返回值,则无法区分数据中的1111 1111还是流达到末尾的指示符。使用int后,所有数据中的字节反应到int中都是一个非负值,而只有流到达末尾的指示符是负值(-1)。与此对应的是OutputStream中的public abstract void write(int b) throws IOException方法,该方法写入一个字节,按理说这里不需要什么标识之类的东西,为什么要传入一个int呢?实际上,传入的int的有效范围只有[0,255](一个byte能表示的范围),如果超出这个范围,则会截断成一个byte。声明参数类型为int,是为了个前面说的read方法相对应,很可能你需要从InuputStream读取一个字节后将其写入到另外一个OutputStream,因为InuputStream那个read的返回值…
Tags: , ,