论坛首页 Java企业应用论坛

OSGi中的DS(Declarative Services)的web应用实现探索

浏览 2764 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-29  
    我正在用equinox的servletbridge在tomcat上搭建web应用,我想每个功能点做成一个bundle,主servlet作为控制器,基于请求URL而调用bundle中的bean来执行,我采用了DS来发布和使用服务。
    我先说一下我想实现的目标吧:
    一个bundle,例如是商品的查看维护,有增、删、改、查四种action,每个需要一个作为一个服务被主servlet调用,其中增、删、改都实现ActionExecute接口,有个void execute方法,查则实现ActionView接口,有Object execute方法(返回object)。
    还有其它的bundle,差不多一个表的增删改查就是一个bundle,并都实现ActionExecute接口和ActionView接口之一。所有bundle中的bean都需要实现这两个公共接口之一。
    主servlet接收到用户请求时,根据请求URL中的对应关系,调用不同的Action去执行。如用户在浏览器输入../getitem,则主servlet把请求作为参数并调用商品bundle中的ItemView的ActionView方法。

1、一个bundel如何发布多个服务呢?每个bundle至少有四个服务需要发布,网上例子中component.xml是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<component name="ItemView">
	<implementation class="com.abc.item.ItemView"/>
	<service>
		<provide interface="com.abc.core.ActionView"/>
	</service>
</component>

多个服务难道是多个service标签吗?那么implementation标签呢?试了一下,多个service标签似乎不行。
多个服务难道需要分别写多个xml配置吗?试了一下可以,我现在使用多个xml文件,一个是一个组件,包含一个服务,即增删改查各自算一个组件了,有点别扭。

2、这种接口的用法似乎与DS所要求的不同,DS的示例程序都是在一个bundle中写一个业务接口,在一个或多个bundle中写它的实现,需要这个服务的bundle中则在component.xml中把实现注入,并可以有“0..1","0..n"等不同的匹配规则。那我应该怎么发布服务呢?也把每个action都写成action接口的实现吗?但我需要根据请求动态注入,而不能在xml中写死,应该怎么处理呢?这个还没有搞定。
    另外,在主servlet中,请求URL中有字符串形式的beanid,如何根据它获得bean实例呢?DS还有lookup方式,但没找到查找过滤服务的方法,DS支持三种生命周期类型的组件,其中有一个factory类型,好象可以解决我的问题,但找不到例子搞不懂。
    但我也想出了一个办法:自己写一个简单的beanManager(类似于spring的FactoryBean),每个bundle初始化(start)时,把所有服务向这个beanmanager注册,结束时(stop)则向beanManager注销,bean id就是component.xml中的name属性,根据请求URL,直接在主servlet中实例化要执行的bean。这种方式如何?

嗯,我先这样做吧,有何结果或问题再向大家汇报。
   发表时间:2009-06-30  
osgi4的Declarative Services还是没有弄清楚,不知如何动态运行时注入。在组件定义文件中写的依赖类似于spring,是固定的,这用处不大。
实在找不到的话,我还是用传统的osgi服务的注册吧,不用DS了
0 请登录后投票
   发表时间:2009-07-01  
可以考虑下使用 Spring DM 来代替 osgi ds
0 请登录后投票
   发表时间:2009-07-01   最后修改:2009-07-01
PS: 对于楼主的问题 1, 应该是这样写:
 <?xml version="1.0" encoding="UTF-8"?>  
 <component name="ItemView">  
     <implementation class="com.abc.item.ItemView"/>  
     <service>  
         <provide interface="com.abc.core.ActionView"/> 
         <provide interface="com.abc.core.OtherInterface"/> 
     </service>  
 </component>

ItemView 是同时实现了这两个接口的类
0 请登录后投票
   发表时间:2009-07-02  
放弃osgi!
问题太多了,一年也解决不完,还是把时间花在具体业务上吧,这东西风险太高了。
为了一点模块化代价太高了,不值得,还不如用php重写呢,一个文件就是一个模块,拷上就能用了。
0 请登录后投票
   发表时间:2009-07-08  
其实爱立信已经使用OSGi开发完成了一个叫OSS 的网络管理软件,里面有很多是使用DS实行的,我有空看看有什么解决办法
0 请登录后投票
   发表时间:2009-11-04  
2009年,OSGi相关的东西,变化太快,变数太多。
Spring-dm,...Java7也要支持动态模块了~...OSGi-ds~~~
疯了~加快标准化进程吧,希望能稳定一阵子,相信稳定后,会有大量优秀的JavaEE作品出现,而且更多的精力可以放到业务逻辑本身。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics