【问题标题】:What is the difference between OSGi Components and ServicesOSGi 组件和服务有什么区别
【发布时间】:2012-02-11 18:33:21
【问题描述】:

在 OSGi 下,组件与服务之间的主要区别是什么? 据我了解,所有服务都必须是组件,但并非所有组件都必须是服务。

在示例用例中使用一个比另一个有什么好处?

【问题讨论】:

    标签: osgi


    【解决方案1】:

    编辑:请参阅 Neil Bartlett 的回答,我已经非常具体地回答了声明式服务,但它比我在这里错误地陈述的要微妙得多。

    简而言之:组件是服务的消费者而不是提供者,服务是注册为服务提供者的组件的扩展。

    组件具有生命周期(取消/激活和修改)、服务依赖管理(取消/绑定)。

    服务是组件的扩展;通过服务注册中心,它通过发布实现的接口和属性向其他捆绑软件等提供服务。

    Services 的用例很明显,使用组件的典型情况是需要管理生命周期、配置或服务依赖关系,但不需要/不想发布组件以供跨包使用。

    【讨论】:

    • 我不同意“组件不是提供者”的说法。组件可以是服务的消费者或提供者,或两者兼而有之,或两者都不是。
    • 如果您将自己限制在组件的 DS 定义中,那是正确的。在蓝图和其他框架中,组件可以使用或连接到同一捆绑包中的其他组件,而无需发布服务。我不认为这是相关的:你可以有一个组件是服务,组件不是服务,服务不是组件......
    • 啊,我明白了(我是通过纯粹的 DS 眼睛看这个的)。因此,服务不一定是组件(例如远程服务)。我会编辑我的帖子并标记你(它不会让我标记自己)。
    • @Neil - 您提到“通过直接在 BundleActivator 中实例化并在 registerService 中注册以老式方式创建服务”。我是 OSGi 的新手,这是我了解创建服务的唯一方法。新方法是什么?
    • @axiopisty 声明式服务。
    【解决方案2】:

    “组件”的定义不如服务正式。

    服务是在 OSGi 服务注册表中注册的任何对象,可以使用其接口名称进行查找。唯一的先决条件是服务应该实现一些接口......任何接口。例如,我可以在java.lang.Runnable 接口下注册一个可运行对象,客户端可以使用该接口名称查找它。

    “组件”往往是一个生命周期被管理的对象,通常由一个组件框架来管理,例如声明式服务 (DS)、蓝图或 iPOJO。有关可用的不同组件框架的讨论,请参阅 OSGi 社区 Wiki 上的 this page

    一个组件可以组合或单独具有以下任何特性:

    • 组件可能被启动停止;这将被视为一个"主动"组件,尽管这也是一个非正式术语。不需要启动或停止的组件称为被动组件。
    • 组件可以发布自己作为 OSGi 服务。
    • 组件可以绑定到使用 OSGi服务。

    一般来说,使用组件框架是使用 OSGi 服务的最简单方法,因为该框架将管理与您想要使用的服务的绑定。例如,您可以说您的组件“依赖于”特定服务,在这种情况下,该组件将仅在该服务可用时创建和激活——并且当该服务不可用时它也将被销毁。

    【讨论】:

    • 您能否提供一个不是服务的组件示例?
    • @santiagozky 当然。假设您想要编写一个位于套接字上并通过 TCP/IP 响应请求的服务器组件。当组件启动时,它会打开套接字并创建服务客户端所需的线程。当它停止时,它会关闭线程和套接字。另一个示例:使用 Swing、SWT 或 JavaFX 创建 GUI 的组件。这些示例组件都不是服务本身,尽管它们可能使用其他组件发布的服务。
    • @santiagozky 顺便说一句...如果您考虑一下,您的应用程序中至少需要这些“活动”组件之一。如果所有组件都只是为其他组件提供服务,那么您的应用程序实际上并没有任何事情;-)
    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2018-01-09
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多