我有一个非常简单的声明式服务示例。我正在关注本教程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 是“满意的”。我的实施有什么问题?
提前致谢
干杯
玛丽