我有一个动态应用程序,它使用OSGi在运行时加载模块化功能。 OSGi包包含模块化功能,应用程序在需要时加载包。这种方法可行,但我想要一个更细粒度的解决方案。捆绑包含通过声明服务控制的组件。我希望能够加载一个包,并且只启用包中所需的组件。我已经在这个领域做过研究,但找不到我满意的解决方案。一种方法是创建一个始终在bundle中启用的“Gatekeeper”组件,并通过ComponentContext让它调用enable和disable组件。这是一个可行的解决方案,但我不能为“把关人”到“知道”的软件包时没有硬编码的组件名称为属性中的“看门人” SCR XML描述符中的其他组件想出一个办法。
我更喜欢的是一种加载bundle并“了解”加载的bundle中的所有组件的方法。能够确定组件所在的捆绑包以及它们当前处于什么状态(类似于列出所有组件的equinox控制台命令'ls')。我想在需要时启用和禁用组件。
控制台如何执行此操作以及如何在应用程序中执行此操作?
更新: @Neil Bartlett:对不起耽搁。我不得不继续做其他事情。现在我回到这个问题上。非常感谢任何进一步的帮助。我的申请是基于角色的。我需要根据它们提供的功能启用组件。目标是最初禁用所有基于角色的组件。在角色更改时,角色管理器轮询每个组件以获取其提供的功能,并确定是否加载它。每个组件将广播它提供的功能(通过公共服务接口)。 ScrService不允许我启用最初禁用的服务组件。最初启用组件并让ScrService在应用程序启动期间尽快禁用它们并不符合我的需求。
答案 0 :(得分:1)
看看ScrService。 Bothe equinox和felix有它。
然而,可以使组件懒惰地加载,即仅在其他组件/束需要时;但这可能不是你想要的。
答案 1 :(得分:0)
在您的服务描述中,将组件标记为已启用,但需要配置管理服务提供的配置信息。然后,您可以编写可以发布和修改组件配置的CM插件服务(不记得确切的术语)。默认情况下,服务由其名称标识,默认情况下是其实现类名称。配置数据作为映射传递,并且可以为空。只要CM提供配置,DS就会使服务可用。
答案 2 :(得分:0)
我有类似的问题,但出于不同的目的: - 我有apache文件安装和配置管理服务,用属性文件外部配置我的组件。 - 我需要确保一些组件从外部文件获取配置,到目前为止我找到的唯一方法是使用ConfigurationPolicy.REQUIRED标记我的组件。 - 但是这样我的插件项目不会在eclipse中运行(没有配置文件)。 - component.xml还包含一个默认的开发配置,所以我没关系,只有我的组件才能启动,直到配置数据可以与configadmin一起使用。我的组件以这种方式不满意,直到有人创建了configadmin条目。 - 我发现如果我创建一个osgi命令行扩展器,它将空配置发送到服务pid,他们将使用component.xml文件中的默认值启动。 - 我刚来这里找到一种列出所有捆绑包的方法
但我认为我使用的这个解决方案也适用于您的设置,这就是我写这个的原因。 只需使用configurtationpolicy.require标记所有组件,您就可以通过使用configadmin添加和删除配置来有选择地启动和停止它们。如果你已经将configadmin用于其他目的,这可能很难,但它可能作为最后的手段管理。