【发布时间】: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 解析器。它工作正常,但远非理想,满足我的自定义需求。