OSGI Bundle结构和与CQ5中其他捆绑包的通信

时间:2015-11-03 06:52:01

标签: java osgi cq5 osgi-bundle

根据我在使用CQ5进行开发时的理解,服务层将位于OSGI捆绑包上。这是否意味着我将创建的每个服务类都相当于一个OSGI Bundle?例如,如果我的CQ5应用程序有3项服务即:登录服务,用户管理服务,注册服务是否意味着还将部署3个OSGI包?以及这些捆绑包如何相互通信?

2 个答案:

答案 0 :(得分:1)

不是真的。捆绑包更像是模块。因此,您可以根据其功能将服务拆分为捆绑包,或者如果您希望在其他项目中重复使用它们。例如,您可以拥有下一个结构:

  • projectname-core :您可以拥有服务,也可以由其他项目使用。像一些用于外部服务的内容Feed生成器,登录服务(如果它在其他项目中也很有用:
  • projectname-ui-beans :你可以拥有bean,你将在你的jsp页面上注入;
  • projectname-services :一般服务,特定于此项目,如搜索或注册;
  • projectname-taglib :你有自己的jsp标签实现;
  • projectname-it-test :捆绑集成测试;
  • projectname-some-specific-stuff :可能有一些服务不依赖于任何其他包,比如一次性内容操作;

请参阅this主题了解基本结构和Maven原型以便创建它。

Upd1 :捆绑包之间的通信可以通过两种方式完成:

  • 您可以将其中一个捆绑包作为另一个捆绑包的依赖项。然后,您可以使用@Reference从其他包
  • 获取服务
  • 您也可以使用事件进行沟通,有关详细信息,请参阅this

答案 1 :(得分:0)

在我看来,拥有小型,专注的捆绑包是很好的,但它并不一定意味着每个服务一个捆绑包。在您的情况下,登录,用户管理和注册看起来完全不同,以保证自己的捆绑。但是,例如,用户管理可能由多个服务实现,所有服务都由同一个包提供。

一个好的经验法则是设计捆绑包,以便删除其中一个捆绑包会禁用一​​致的功能单元。删除您的用户管理"例如,bundle会禁用所有用户管理功能,理想情况下不会影响登录或注册。

至于沟通,请考虑服务。使用Declarative Services,OSGi组件只需声明它们需要哪些服务(通常使用@Reference注释),并且框架只需在所需的所有服务都可用时启动组件。