ServiceTracker找到了哪些服务

时间:2017-04-22 14:15:34

标签: java osgi

我们假设我们有两个捆绑包 - 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消息)。

1 个答案:

答案 0 :(得分:2)

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