获取OSGi声明服务的服务实现列表

时间:2011-10-06 08:27:47

标签: eclipse osgi declarative-services

我有一个非常简单的声明性服务示例。我正在学习本教程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).Hwever,使用控制台命令“services”我看到导出器包被imporeter使用。此外,使用ss和ls我可以看到组件eporter“满意”。 我的实施有什么问题?

提前致谢

干杯

玛丽

1 个答案:

答案 0 :(得分:2)

任何版本的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文档。