我有一个非常简单的声明性服务示例。我正在学习本教程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“满意”。 我的实施有什么问题?
提前致谢
干杯
玛丽
答案 0 :(得分:2)
任何版本的DS都不支持以下绑定签名:
public void setRunnable(Runnable r, ServiceReference ref)
相反,您必须仅 ServiceReference
并使用ComponentContext
或BundleContext
来访问服务实例对象。
或者,如果您想要更多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文档。