首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Java跟Jython的结合

2012-10-12 
Java和Jython的结合最近重新设计一个程序,这个程序有一个功能是监视其他进程的内存使用情况,并且在满足一

Java和Jython的结合

最近重新设计一个程序,这个程序有一个功能是监视其他进程的内存使用情况,并且在满足一定条件的时候促发警告给用户。一般的条件是,内存超过某个阀值。可是如果希望这个条件可以复杂些,譬如超过2G时并且持续增长2天,就告警;或者如果小于1G,并且在10天以内总体趋势是增长的,也告警。总之,这个条件可以支持很复杂的条件,并且需要动态修改(主模块不重启的情况下),所以我的选择是结合Java和Jython。其实Java上面可以选用JRuby, Scala, Groovy或者Javascript,选择Jython的理由有以下几点:

[1] 单位有一些项目已经使用了Python;

[2] Scala和Groovy会的人太少,太前卫了;

[3] Javascript很好,不过考虑到也许今后所有Java的程序扩展都会使用一种脚本语言,明显Javascript系统的交互能力太差。譬如链接数据库,处理文件啊

[4] Ruby是我太难割舍的,因为我喜欢Ruby,其实Ruby企业版已经比较稳定了,而且JRuby也有官方的支持。只不过,单位中已经有项目使用了Python,如果冒然的引入Ruby,势必会增加系统的复杂度。

[5] 即使有JPerl,JTcl,我也不会选用。原因很简单,我需要更好的模块化面向对象的脚本,面向对象不是银弹,可是大家都很熟悉面向对象了,而且实践证明面向对象鼓励大家写出好维护的代码(结合设计模式)。

[6] C++可以和Python集成(Boost.Python)(当然了,Lua更方便与C++集成,可是Lua会的人也太少)。

[7] 可以用Java写,然后用反射,可以做。不过我觉得脚本更好,省掉了编译的过程。(因为在现场,不能保证你的Unix上面装了JDK,只能保证一定有JRE)。

[8] 使用的是Java5,不是Java6,所以JSR233(好像是这个吧)不是直接可以用的。

?

因为这个项目是单位的项目,所以我把我做得Prestudy的小程序拿出来和大家共享一下解决方案。

?

我总喜欢用计算器这样的小例子来做PreStudy,呵呵。

?

首先设计一个计算器的接口ICalc(用Java写的), 如下:

?

import sys# add sys pathdef addSysPath():  sys.path.append("/Users/AnkyHe/proj/java/CalcPlugin/icalc.jar")addSysPath()from com.gmail.at.ankyhe.calc import ICalcclass MyCalc(ICalc):  def __init__(self):    pass  def pushData(self, arr):    self.arr = arr  def getResult(self):    return sum(self.arr)    #return min(self.arr)calc = MyCalc()'''if __name__ == '__main__':  mycalc = MyCalc()  arr = [1, -100, 20]  mycalc.pushData(arr)  if sum(arr) == mycalc.getResult():    print('true')  else:    print('false')    print(mycalc.getResult())'''
?

sys.path.append是把接口ICalc的jar文件加入到Jython的使用环境中,这样才可以import ICalc。注意最后的if __name__ == '__main__', 这里体现了用Jython的一个优点,可以通过Jython做测试。因为这只是一个Presutdy,主要任务是验证一下这个流程,所以可能有一些错误处理没有写得很全面。源代码和可执行文件(我在Mac上编译运行通过了)如附件,执行的时候请用:

java -cp ./icalc.jar -jar calcplugin.jar script/mycalc.py

编译的时候使用把icalc.jar和jython.jar加入到classpath中。

然后你修改mycalc.py,可以看到输出结果的改变。

?

?

?

?

?

?

热点排行