有没有人有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包导出正确的包,使用该服务的包导入相同的包。
这里可能出现什么问题?我完全失去了。
答案 0 :(得分:1)
看起来不错。
我想到的是:订购还好吗?您确定在检查参考之前完成了注册吗?您检查printAllEntries的方式是检查该服务是否就在那一刻。由于OSGi捆绑包可以来去,这不是一种可靠的检查方式。您应该使用ServiceTracker,或者更好地使用Declarative Services或Blueprint。
您可以将ServiceListener添加到BundleContext,然后您可以打印出以什么顺序发生的事情。
希望这有帮助。
答案 1 :(得分:0)
事实证明,这只是我没有刷新OSGi包。我的servlet指向一个现已过时的软件包ID,所以当然服务查找失败了。