【问题标题】:OSGI Bundle Structure and communication to other bundles in CQ5OSGI Bundle 结构以及与 CQ5 中其他 bundle 的通信
【发布时间】:2016-02-03 05:54:11
【问题描述】:

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

【问题讨论】:

    标签: java osgi aem osgi-bundle


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 2011-06-18
        • 1970-01-01
        • 2013-11-24
        • 2013-02-10
        • 1970-01-01
        • 2015-04-24
        相关资源
        最近更新 更多