【问题标题】:OSGi and Component ManagementOSGi 和组件管理
【发布时间】:2011-11-12 16:13:04
【问题描述】:

我有一个动态应用程序,它使用 OSGi 在运行时加载模块化功能。 OSGi 包包含模块化功能,应用程序会在需要时加载这些包。这种方法可以,但我想要一个更细粒度的解决方案。捆绑包包含通过声明式服务控制的组件。我希望能够加载一个包,并且只启用包中需要的组件。我已经在这方面进行了研究,但找不到我满意的解决方案。一种方法是创建一个始终在捆绑包中启用的“看门人”组件,并通过 ComponentContext 让它调用启用和禁用组件。这是一个可行的解决方案,但如果不将组件名称硬编码为“gatekeepers”SCR xml 描述符中的属性,我无法找到让“gatekeeper”“了解”捆绑包中其他组件的方法。

我更喜欢的是一种加载包和“了解”加载包中所有组件的方法。能够确定组件位于哪个捆绑包中以及它们当前处于什么状态(类似于列出所有组件的Equinox 控制台命令“ls”)。我想在需要时启用和禁用组件。

控制台如何做到这一点,我如何在应用程序中做到这一点?

更新: @Neil Bartlett:抱歉耽搁了。我不得不转向别的事情。现在我回到这个问题上。真的很感激任何进一步的帮助。我的应用程序是基于角色的。我需要根据它们提供的功能启用组件。目标是最初禁用所有基于角色的组件。角色更改后,角色管理器会轮询每个组件以获取其提供的功能并确定是否加载它。每个组件将广播它提供的功能(通过公共服务接口)。 ScrService 不允许我启用最初禁用的服务组件。最初启用组件并让 ScrService 在应用程序启动期间尽快禁用它们不符合我的需求。

【问题讨论】:

  • 是的,网守需要知道它希望启用/禁用的组件的 ID。请记住,您还可以传递 null 来启用/禁用 all 包中的其他组件。您可能也知道,网守只能访问同一捆绑包中的其他组件,而不能访问任何其他捆绑包。 《四十二》使用 ScrService 的建议不错。
  • @Toolshed 你终于解决了这个问题吗?我对 ScrService 有同样的问题。
  • @PabloGarcía 最后得到了一个非常混乱的实现,需要一个自定义的 scr xml 解析器。它工作正常,但远非理想,满足我的自定义需求。

标签: osgi declarative-services


【解决方案1】:

看看ScrService。春分和菲利克斯都有。

但是,可以使组件延迟加载,即仅在其他组件/捆绑包需要时;但这可能不是你想要的。

【讨论】:

  • ScrService 正是我所需要的。这将允许我根据需要动态启用和禁用组件。
  • 在使用 ScrService 之后,我发现了一个无法解决的问题。只有在最初启用组件时,我才能在外部启用和禁用组件(不在同一个包中)。我需要最初禁用组件,然后在需要时启用。这行不通。如果一个组件最初被禁用,它会显示(从调试)一个不满意的状态。如果组件不满意,则无法启用。这是一个错误吗?这肯定不是本意。
  • 示例输出:osgi> ls -c 21 捆绑包测试中的组件:ID 组件详细信息 37 ​​组件[名称 = test.TestImpl activate = activate deactivate = deactivate modified = configuration-policy = ignore factory = null autoenable = false immediate = true implementation = test.TestImpl state = Unsatisfied properties = serviceFactory = false serviceInterface = [java.util.Comparator] references = null 位于 bundle = Test_1.0.0 [21] ] 动态信息:组件满足所有组件引用都满足组件配置:
  • @Toolshed:我没有考虑过这个含义,但现在你描述它,它是有道理的。禁用的组件不应从外部“强制”进入启用状态;只有捆绑包内部的组件(即“网守”)可以知道是否可以启用它。我认为在这一点上退后一步并在更高的层次上描述你想要实现的目标会很有用,可能有一个替代的更优雅的解决方案。
【解决方案2】:

在您的服务描述中,将组件标记为已启用,但需要配置管理服务提供的配置信息。然后您可以编写一个可以发布和修改组件配置的 CM 插件服务(不记得确切的术语)。默认情况下,服务由它们的名称标识,默认情况下是它们的实现类名称。配置数据作为映射传递,可以为空。 DS 将在 CM 提供配置后立即提供该服务。

【讨论】:

  • 我需要在组件激活之前与它们进行通信。这就是 ScrService 更具吸引力的原因。我已经更新了我的原件以澄清。
【解决方案3】:

我有类似的问题,但目的不同: - 我有 apache 文件安装和配置管理服务,可以使用属性文件在外部配置我的组件。 - 我需要确保某些组件从外部文件中获取配置,到目前为止我发现的唯一方法是使用 ConfigurationPolicy.REQUIRED 标记我的组件。 - 但是这样我的插件项目就不会在 eclipse 中运行(没有配置文件)。 - component.xml 还包含一个默认的开发配置,所以我可以接受,只是我的组件在 configadmin 有可用的配置数据之前不会启动。我的组件以这种方式不满意,直到有人创建了一个 configadmin 条目。 - 我发现如果我创建一个 osgi 命令行扩展器,将空配置发送到服务 pid,它们将以 component.xml 文件中的默认值启动。 - 我只是来这里寻找一种列出所有捆绑包的方法

但我认为我使用的这个解决方案也适用于您的设置,这就是我写这篇文章的原因。 只需使用 configurtationpolicy.require 标记所有组件,您就可以通过使用 configadmin 添加和删除配置来选择性地启动和停止它们。如果您已经将 configadmin 也用于其他目的,这可能会很困难,但作为最后的手段,它可能是可以管理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2011-08-26
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多