karaf osgi getServiceReference返回null

时间:2013-03-21 20:12:35

标签: service osgi bundle apache-karaf osgi-bundle

有没有人有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包导出正确的包,使用该服务的包导入相同的包。

这里可能出现什么问题?我完全失去了。

2 个答案:

答案 0 :(得分:1)

看起来不错。

我想到的是:订购还好吗?您确定在检查参考之前完成了注册吗?您检查printAllEntries的方式是检查该服务是否就在那一刻。由于OSGi捆绑包可以来去,这不是一种可靠的检查方式。您应该使用ServiceTracker,或者更好地使用Declarative Services或Blueprint。

您可以将ServiceListener添加到BundleContext,然后您可以打印出以什么顺序发生的事情。

希望这有帮助。

答案 1 :(得分:0)

事实证明,这只是我没有刷新OSGi包。我的servlet指向一个现已过时的软件包ID,所以当然服务查找失败了。