【发布时间】: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 <method-name>(ServiceReference);,void <method-name>(<parameter-type>);,void <method-name>(<parameter-type>, Map) -
Danail 是正确的,尽管这些扩展签名仅在 DS 1.1 中可用,这进一步需要将 1.1 命名空间添加到 XML 文档中。有关详细信息,请参阅下面的答案。
标签: eclipse osgi declarative-services