【问题标题】:get list of services implementations with OSGi declarative services使用 OSGi 声明式服务获取服务实现列表
【发布时间】:2011-12-02 01:53:48
【问题描述】:

我有一个非常简单的声明式服务示例。我正在关注本教程http://www.eclipsezone.com/eclipse/forums/t97690.html?start=0。每件事都按预期工作。但是,我无法弄清楚如何使“SampleImporter”(预计将使用其他捆绑包服务的捆绑包)了解“SampleExporter”列表(提供服务的捆绑包)。换句话说,我希望“SamlpeImporter”看到它最终使用的包的 ID。此信息对我的应用程序非常有用。

这是 SampleExporter 的 XML 文件:

<?xml version="1.0"?>
<component name="samplerunnable">
<implementation class="org.example.ds.SampleRunnable"/>
<property name="ID" value="expoter" />
<service>
<provide interface="java.lang.Runnable"/>
</service>

对于 SampleImporter:

<?xml version="1.0"?>
<component name="commandprovider1">
<implementation class="org.example.ds.SampleCommandProvider1"/>
<service>
<provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
</service>
<reference name="RUNNABLE"
    interface="java.lang.Runnable"
    bind="setRunnable"
    unbind="unsetRunnable"
    cardinality="0..1"
    policy="dynamic"/>
</component>

在 Importer 端,我有以下功能:

public class SampleCommandProvider1 implements CommandProvider {
    private Runnable runnable;
public synchronized void setRunnable(Runnable r) {
    runnable = r;
}
public synchronized void unsetRunnable(Runnable r) {
    runnable = null;
}
public synchronized void _run(CommandInterpreter ci) {
    if(runnable != null) {
            runnable.run();
    } else {
        ci.println("Error, no Runnable available");
    }
}
public String getHelp() {
    return "\trun - execute a Runnable service";
}

}

这很好用,但是如果我想获取属性的值,请使用

public synchronized void setRunnable(Runnable r, Map properties)

public synchronized void setRunnable(Runnable r, ServiceReference reference)

永远不会调用导出器的运行方法,这意味着绑定函数(未调用 setRunnable)。但是,使用控制台命令“服务”我看到导出器包被导入器使用。此外,使用 ss 和 ls 我可以看到组件 eporter 是“满意的”。 我的实施有什么问题?

提前致谢

干杯

玛丽

【问题讨论】:

  • 我建议您至少添加您的声明性服务 XML。仅仅为了弄清楚你的问题是什么而去阅读一篇文章并不是很方便。否则,如果您指定要接收ServiceReference 而不是直接接收服务对象,则可以使用ServiceReference.getBundle() 方法检索注册服务的捆绑包。
  • 感谢您的快速回复。对于最初的误导性问题,我们深表歉意。我已经编辑了我的问题,并试图尽可能清楚。我想我的问题并没有那么复杂,但是由于我是新手,所以我遗漏了一些要点。我非常感谢任何帮助或提示。
  • 问题是您的方法符号不受支持。根据规范,支持以下签名:void &lt;method-name&gt;(ServiceReference);,void &lt;method-name&gt;(&lt;parameter-type&gt;);,void &lt;method-name&gt;(&lt;parameter-type&gt;, Map)
  • Danail 是正确的,尽管这些扩展签名仅在 DS 1.1 中可用,这进一步需要将 1.1 命名空间添加到 XML 文档中。有关详细信息,请参阅下面的答案。

标签: eclipse osgi declarative-services


【解决方案1】:

任何版本的 DS 都不支持以下绑定签名:

public void setRunnable(Runnable r, ServiceReference ref)

相反,您必须使用ServiceReference 并使用ComponentContextBundleContext 来访问服务实例对象。

或者,如果您想要一种更 POJO 风格的访问服务属性的方式,DS 1.1 中允许使用以下绑定签名(但在 DS 1.0 中不允许):

public void setRunnable(Runnable r, Map properties)

要访问 DS 1.1 功能,您需要将正确的命名空间添加到您的 XML 中,如下所示:

<component xmlns='http://www.osgi.org/xmlns/scr/v1.1.0' name='...'>

顺便说一句,我很久以前写了这篇原创文章!这些天我会使用bnd annotations 来避免手动编写 XML 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2019-09-25
    • 2013-10-09
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多