OSGi动态拔插,动态部署,动态权限菜单
今天和思雨同学把动态菜单,权限以及Bundle的动态拔插基本给解决了。
大致的场景是这样的:
1、进行权限控制,RBAC0,权限-角色-菜单,菜单只是对应到页面,不涉及页面的具体操作组件,实现起来不是太麻烦。(之前本来打算把权限控制到按钮的,但是项目只要求到页面就方便了很多)。
2、权限控制这块,之前打算控制到组件,用的自定义标签,TagSupport或SimpleTagSupport,其他的项目用了自定义标签,不过麻烦也随之而来了。传统Web项目,有WEB-INF目录,自定义标签放在这个目录下。OSGi以Bundle形式开发,同时也没有WEB-INF目录,如何让OSGi识别tld文件,同时让其他Bundle能够使用这个自定义标签成了问题(把jetty模块当成Bundle嵌入其中的这种方式,我像通过解压jettyBundle,将标签放入jettyBundle的WEB-INF目录,但估计这种方式可能性较大,提供大家参考,可以自己动手试一把,我还没试验过)。
3、权限这块的,就是简单的数据库设计,不算太麻烦。这也是大家可以想到的。之前的系统每个功能模块的菜单权限通过配置文件配置,然后解析存放入数据库。用户登录时读配置文件校验。我的建议是保存数据库。为了保存菜单扩展点,首先判断数据库中是否有新Bundle的信息,没有就解析保存,有就直接读数据库。
4、由此可见,上面的配置文件之类的东西纯粹是依赖OSGi扩展点的。
5、OSGi的可拔插,之前我打算通过Spring DM发布服务,监听Bundle启动。解析Bundle之后保存入库。后来实现BundleListener接口,实现 public void bundleChanged(BundleEvent event) 方法,将解析方法放入其中。 注意:BundleListener接口所在的Bundle启动级别必须先启动,这里涉及一个启动级别的问题。
6、动态拔插:在平台启动之后,通过 install file 将开发模块install其中(注意,install之后bunldle的状态是Installed而不是started)。卸载就更方便了。
7、动态部署:这个问题结合上面的问题也很方便,上传至服务器指定目录,通过shell脚本安装。当然也可以通过数据库表保存相关Bundle路径信息实现。
提供给各位朋友参考,大家有更好的思路也可以和我讨论。