按月存档: 2012/09

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, 基础评论:11条作者:ticmy日期:2012-09-28

在书本中,课堂上,关于a+=b大都说等价于a = a+b,其实不然,+=中包含着更多的东西。 在继续之前,来温故一点基础(为简单起见,只说整数)。 1、做基本运算(如+、-、*、/、、>>>、~、^等),当两个操作数的类型是byte,short,char,int之一的时候,结果的类型是int; 2、做整数基本运算时,当一个操作数是long,结果是long; 3、不加任何修饰的整数字面值默认就是int类型。 下面对上面的几点举例说明: short s1 = 1;//OK short s2 = s1 + 1;//ERROR 上面的第一句1整形字面值,它的类型是int,为什么可以直接赋值给short呢?因为字面值都是常量,编译器能很容易的检测出它到底在不在short所能表示的值的范围内。当写成short s1 = 32768的时候,编译就知道short容不下32768了,就会报错。 而对于第二句,s1是short类型,1是int类型,结果是int类型,自然不能自动赋值给short类型的s2了,因为有潜在的高位有效值被截断的风险。可能会有人想,上面s1已经赋值了一个字面值,对于下面的s2,编译器应该也可以计算出它的值啊。如果s1是final的,确实会这样,但s1是变量,编译器是无法预测它会不会在运行期改变的,即使它可能不会改变。 再来一个,计算一年有多少毫秒…

jsr223-Java中的script引擎接口

分类:java评论:7条作者:ticmy日期:2012-09-04

JDK1.6开始,Java引入了jsr223,就是可以用一致的形式在JVM上执行一些脚本语言,如js。先来一个简单的例子以对在jvm上运行脚本有个初步的认识。 import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class TestScript1 { public static void main(String[] args) throws Exception { ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript"); String exp = "2*6-(6+5)"; Object result = scriptEngine.eval(exp); System.out.println(exp + "=" + result); } } 上面的例子是用来计算2*6-(6+5)这个表达式的值,使用了js引擎来计算,非常方便。另外,在工作流中,通常使用脚本引擎来计算一个节点到另一个节点之间的条件是否通过。如果不用脚本/表达式引擎,那就需要自己解析脚本了,若是算术算式,通常是构造成一个逆波兰式,这不是本文重点,就不展开了。 上面计算的表达式是“常量”,还可以计算带有变量的,如下: import javax.script.S…