宣言型サービスの非常に単純な例があります。私はこのチュートリアル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 が「満足」していることがわかります。私の実装の何が問題になっていますか?
前もって感謝します
乾杯
マリー