OSGi的最大优点就是能实现热部署(hot deployment),所谓热部署,就是在不停止服务运行的情况下(或者说在不影响用户体验前提下)动态更新其服务内容(和硬件领域的热插拔的概念很类似)。上篇bundle动态更新文章中,我们知道了如何在手动更新bundle(通过update,refresh,install等功能),现在有个新问题:如果对某个bundle需要更新时,需要手动把这个新版本的bundle拷贝到原来bundle的目录下,然后在手动在OSGi框架下手动点击update,refresh等按键进行更新。对于需要频繁更新bundle或者更新的bundle数量比较多的场合,未免太麻烦了,有没有办法让系统自动检测bundle更新情况,并安装运行,从而实现系统真正意义上的自动运行呢。
其实,各个OSGi框架都提供了相应的bundle来是实现这个功能(Apache Felix下的File Install; Knopflerfish 下的 Directory Deployer)。使用非常简单,以Directory Deployer为例说明如何应用
1:在Knopflerfish目录下新建名为文件夹load。将需要运行的各bundle拷贝至该文件夹中。
2:运行Knopflerfish,将Directory Deployer bundle导入并执行。
3:当我们要批量更新自己部署的bundle时,只需将新版本复制到load文件夹中,系统将会以固定周期扫描该文件夹里的bundle,对比版本后,自动完成更新。
注:(load文件夹和 扫描周期可以自定义,只需修改Deployer包中metatype.xml文件的如下两个属性(默认设置为load 文件夹, 周期为1000ms)。
<org.knopflerfish.fileinstall.dir> ./load</org.knopflerfish.fileinstall.dir>
<org.knopflerfish.fileinstall.poll> 1000</org.knopflerfish.fileinstall.poll>