2013-03-21 66 views
1

有没有人有任何经验getServiceReference返回null什么似乎没有理由?karaf osgi 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 Web控制台,服务似乎是正确注册:

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

原来,这只是我没有刷新OSGi包。我的servlet指向一个现在已经过时的bundle ID,所以当然服务发现失败了。

1

它看起来没问题。

想到什么:订购是否正常?您确定在检查参考前完成了注册吗?您检查printAllEntries的方式可以检查服务是否在那一刻。由于OSGi包可以来去,这不是一个可靠的检查方法。您应该使用ServiceTracker,或者更好地使用声明式服务或Blueprint。

您可以将ServiceListener添加到BundleContext,然后您可以按照什么顺序打印出发生了什么。

希望这会有所帮助。

+0

是的,使用服务跟踪器,这是好多了。 – 2013-03-22 11:54:34