我们假设我们有两个捆绑包 - BundleA和BundleB。 BundleA包含一项服务。 BundleB包含ServiceTracker。
在我看来,只有在BundleA之前启动bundleB时,bundleB中的ServiceTracker才会找到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();
}
}
当我在bundleA(pax-logging-service)之前启动bundleB(mybundle)时 - everyhing工作并添加服务(我看到# Service was added
消息)。当我在bundleA(pax-logging-service)之后启动bundleB(mybundle)时 - 什么都行不通,并且永远不会添加服务(即使在一分钟之后我也看不到# Service was added
消息)。
答案 0 :(得分:2)
这是不正确的。当您打开服务跟踪器时,它将立即看到服务注册表中可用的所有服务。如果您怀疑自己没有看到服务,即使它已注册,也可能是因为它对您的捆绑包不可见(因为捆绑包在框架中如何解析和连线)。