1

理由がないように思われる理由でgetServiceReference戻ってきた経験がある人はいますか?null

次のバンドルはサービスを登録し、登録されていることを確認します (これが同じパッケージ idk からの有効なテストであるかどうか)。

package db.connector;
...
public class Activator implements BundleActivator {
    private static ServiceRegistration registration;
    ...
    public void start(BundleContext _context) throws Exception {
        DatabaseConnector dbc = new DatabaseConnectorImpl();
        registration = context.registerService(
                DatabaseConnector.class.getName(),
                dbc, null);

        checkServiceRegistered();
    }
    ...
    public void checkServiceRegistered() {
        System.out.println("Printing all entries:");
        ServiceReference sr = context.getServiceReference(DatabaseConnector.class.getName());
        DatabaseConnector dbc = (DatabaseConnector) context.getService(sr);
        List<Protocol> result = dbc.getAllProtocols();
        for(int i=0; i<result.size(); i++) {
            Protocol p = result.get(i);
            System.out.println("\t" + p.getId()+": "+p.getName()+"("+p.getOwner()+")");
        }
    }
}

出力は正常に実行され、すべて問題ないようです。karaf Webconsole を確認すると、サービスが正しく登録されているようです。

267 [db.connector.DatabaseConnector]    database-connector (144)

登録されたサービスを取得するコードは次のとおりです。

import db.connector.DatabaseConnector;
    ...
    public List<Protocol> printAllEntries() {
        ServiceReference sr = Activator.getContext().getServiceReference(DatabaseConnector.class.getName());
        DatabaseConnector dbc = (DatabaseConnector) Activator.getContext().getService(sr);
        return dbc.getAllProtocols();
    }
    ...

DatabaseConnector バンドルは正しいパッケージをエクスポートし、サービスを使用するものは同じパッケージをインポートします。

ここで何がうまくいかない可能性がありますか?私は完全に途方に暮れています。

4

2 に答える 2

1

大丈夫そうです。

頭に浮かぶのは、注文は大丈夫ですか?参照を確認する前に、登録は完了していますか? printAllEntries をチェックインする方法で、その瞬間にサービスが存在するかどうかを確認します。OSGi バンドルは出入りする可能性があるため、これは信頼できるチェック方法ではありません。ServiceTracker を使用するか、Declarative Services や Blueprint のようなものを使用する必要があります。

BundleContext に ServiceListener を追加すると、何が起こっているかをどの順序で出力することができます。

お役に立てれば。

于 2013-03-21T22:50:59.500 に答える
0

結局のところ、OSGi バンドルを更新しなかったことが原因でした。私のサーブレットは現在は廃止されたバンドル ID を指していたので、もちろんサービスの検索は失敗していました。

于 2013-03-25T21:57:50.950 に答える