1

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

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

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

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

4

3 回答 3

1

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

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

于 2011-11-12T16:52:36.707 回答
0

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

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

于 2014-02-03T08:31:20.060 回答
0

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

于 2011-11-23T02:39:16.313 回答