ServiceTracker 找到什么服务
What services does ServiceTracker find
假设我们有两个包 - BundleA 和 BundleB。 BundleA 包含一项服务。 BundleB 包含 ServiceTracker。
在我看来,只有当 bundleB 在 BundleA 之前启动时,bundleB 中的 ServiceTracker 才会找到 BundleA 的服务。换句话说,ServiceTracker 找不到在 ServiceTracker.open() 之前注册的服务。这是正确的吗? P.S。我在 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) 时 - 一切正常并且服务已添加(我看到 # Service was added
消息)。当我在 bundleA (pax-logging-service) 之后启动 bundleB (mybundle) - 没有任何效果并且服务从未添加(即使在一分钟后我也没有看到 # Service was added
消息)。
这是不正确的。当您打开服务跟踪器时,它会立即看到服务注册表中可用的所有服务。如果您怀疑您没有看到服务,即使它已注册,也可能是因为它对您的包不可见(因为包是如何在框架中解析和连接的)。
假设我们有两个包 - BundleA 和 BundleB。 BundleA 包含一项服务。 BundleB 包含 ServiceTracker。
在我看来,只有当 bundleB 在 BundleA 之前启动时,bundleB 中的 ServiceTracker 才会找到 BundleA 的服务。换句话说,ServiceTracker 找不到在 ServiceTracker.open() 之前注册的服务。这是正确的吗? P.S。我在 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) 时 - 一切正常并且服务已添加(我看到 # Service was added
消息)。当我在 bundleA (pax-logging-service) 之后启动 bundleB (mybundle) - 没有任何效果并且服务从未添加(即使在一分钟后我也没有看到 # Service was added
消息)。
这是不正确的。当您打开服务跟踪器时,它会立即看到服务注册表中可用的所有服务。如果您怀疑您没有看到服务,即使它已注册,也可能是因为它对您的包不可见(因为包是如何在框架中解析和连接的)。