假設我們有兩個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
消息)。
謝謝你的回答。我花了大約一小時試圖找出爲什麼bundleB沒有找到bundleA的服務。與此同時,bundleB找到了bundleC,bundleD等的服務。通過更改順序解決了問題 - 當我在bundleA之前啓動bundleB時。你可以試試。 –
@Pavel Marcel說的絕對正確。你的代碼必須有其他問題 - 你可能需要發佈更多關於你在做什麼的細節。 –
請看我的編輯。 –