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,或者更好的是像声明式服务或蓝图这样的东西。

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

希望这可以帮助。

于 2013-03-21T22:50:59.500 回答
0

原来,只是我没有刷新 OSGi 包。我的 servlet 指向一个现已过时的捆绑包 ID,因此服务查找当然失败了。

于 2013-03-25T21:57:50.950 回答