2017-04-22 53 views
0

假设我们有两个bundle - BundleA和BundleB。 BundleA包含一项服务。 BundleB包含ServiceTracker。ServiceTracker发现的服务

在我看来,bundleB中的ServiceTracker只有在bundleB在BundleA之前启动时才会查找BundleA的服务。换句话说,ServiceTracker没有找到在ServiceTracker.open()之前注册的服务。这是正确的吗?附:我在Apache Felix上看到了这种行为。

编辑 正如我所说,我的声明是错误的,这里是我的代码。 BundleA - pax-logging-service。在bundleB我有以下代码:

public class PaxLoggingServiceCustomizer implements ServiceTrackerCustomizer<Object, Object>{ 

    private final BundleContext context; 

    public PaxLoggingServiceCustomizer(BundleContext context) { 
     this.context=context; 
    } 

    @Override 
    public Object addingService(ServiceReference<Object> reference) { 
     System.out.println("# Service was added"); 
     ManagedService paxService = (ManagedService)context.getService(reference); 
     return paxService; 
    } 

    @Override 
    public void removedService(ServiceReference<Object> reference, Object service) { 
    } 

    @Override 
    public void modifiedService(ServiceReference<Object> reference, Object service) { 
     //do nothing 
    }  

} 

这是bundleB激活

public class Activator implements BundleActivator { 

    private ServiceTracker serviceTracker; 

    public void start(BundleContext context) throws Exception { 
     String f = "(&(service.pid=org.ops4j.pax.logging)(objectClass=" + ManagedService.class.getName()+"))"; 
     Filter filter=FrameworkUtil.createFilter(f); 
     serviceTracker=new ServiceTracker(context,filter, new PaxLoggingServiceCustomizer(context)); 
     serviceTracker.open(); 
    } 

    public void stop(BundleContext context) throws Exception { 
     serviceTracker.close(); 
    } 

} 

当我开始bundleB bundleA(PAX-测井服务)之前(mybundle) - 加入everyhing工程和服务(我看到# Service was added消息)。当我在bundleA(pax-logging-service)之后启动bundleB(mybundle)时 - 没有任何工作和服务永远不会被添加(即使在一分钟后,我也看不到# Service was added消息)。

回答

2

这是不正确的。当您打开服务跟踪器时,它会立即看到服务注册表中可用的所有服务。如果您怀疑自己没有看到服务,即使它已经注册,也可能是因为它对您的包不可见(因为捆绑包是如何在框架中解决和连线的)。

+0

谢谢你的回答。我花了大约一小时试图找出为什么bundleB没有找到bundleA的服务。与此同时,bundleB找到了bundleC,bundleD等的服务。通过更改顺序解决了问题 - 当我在bundleA之前启动bundleB时。你可以试试。 –

+0

@Pavel Marcel说的绝对正确。你的代码必须有其他问题 - 你可能需要发布更多关于你在做什么的细节。 –

+0

请看我的编辑。 –