0

我有一个非常简单的声明式服务示例。我正在关注本教程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>

在进口商方面,我有以下功能:

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)

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

提前致谢

干杯

玛丽

4

1 回答 1

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 注释来避免手动编写 XML 文档。

于 2011-10-07T06:27:36.943 回答