【问题标题】:Dynamically create and configure OSGi Services with dependencies动态创建和配置具有依赖关系的 OSGi 服务
【发布时间】:2010-07-18 19:54:33
【问题描述】:

在我当前的应用程序中,我想通过用户界面在运行时创建和配置 osgi 服务。我查看了 OSGi 元类型规范,但它只支持简单的类型属性。

所以我的问题是:是否有充分的理由不支持诸如其他 osgi 服务之类的属性类型,是否有人知道已经存在的执行此类操作的项目?

更新

进一步澄清我的问题:

我想做的是根据软件用户的需要创建和配置新服务。如果将新的服务接口添加到系统中,这甚至应该可以工作。

假设我有一个用于发送通知的服务接口

public interface NotificationService {
    void notify(Notification n);
}

以及用于向例如发送通知的实现推特。通过 Metatype 规范,我可以对 twitter 服务需要用户名和密码的信息进行编码。这使我可以在运行时动态创建 UI 以创建新的 twitter 通知服务。

这适用于简单的数据类型,但元类型规范不处理与其他服务的依赖关系。例如。假设 Notification 有文件附件,因此 Twitter 服务需要 FileUpload 服务来存储文件。

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    您始终可以使用 BundleContext#registerService() 注入新服务,但是当时的服务必须已初始化并准备好运行。您可能会发现 OSGi 4.2 规范的新蓝图服务(甚至是更旧但更广泛的动态服务)很有用。

    最后,这取决于你想做什么。当您在运行时说“创建”和“配置”osgi 服务时,您是什么意思?

    【讨论】:

    • 我试图通过一个例子来澄清我的问题。我希望这有助于理解我想要做什么。
    • 得到了例子。 Metatype 服务无法帮助您,我认为它与您设想的用例不太匹配。您可以做的是拥有一个简单的字符串值属性,其中包含可用的特定文件上传服务的选项(当然,这会硬编码服务之间的依赖关系 - 如果您添加带有新文件上传服务的捆绑包会发生什么?)然后使用 ServiceTracker 使用自定义属性过滤器获取服务。我认为使用您自己的元数据描述系统(使用注释!)会更好地为您工作。甚至是 Eclipse 注册表。
    • 只是想知道这是否回答了 crazymaik 的原始问题。
    【解决方案2】:

    因此,在您的示例中,您基本上是在说可以配置服务的实现,并且该配置可能表明该实现需要另一个服务。基本上,您正在寻找一个允许您在代码中声明实现的依赖关系的系统,而不是在静态 XML 文件中(如声明式服务和大多数其他人所做的那样)。

    解决您的问题的方法是使用 Apache Felix 依赖管理器。它有一个声明性的 Java API,允许您在运行时添加和删除依赖项。可以在此处找到一些帮助您入门的基本示例:http://felix.apache.org/site/apache-felix-dependency-manager-getting-started.html 我建议您从源代码构建 3.0.0-SNAPSHOT,因为这是最新最好的,目前相当稳定。

    如果有帮助,我可以为您上面描述的示例提供实际的示例代码。告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2011-12-31
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多