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 に答える