2017-04-22 55 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

請看我的編輯。 –