假设我们有两个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说的绝对正确。你的代码必须有其他问题 - 你可能需要发布更多关于你在做什么的细节。 –
请看我的编辑。 –