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 消息)。

这是不正确的。当您打开服务跟踪器时,它会立即看到服务注册表中可用的所有服务。如果您怀疑您没有看到服务,即使它已注册,也可能是因为它对您的包不可见(因为包是如何在框架中解析和连接的)。