java - ServiceTracker 找到哪些服务

标签 java osgi

假设我们有两个 bundle - BundleA 和 BundleB。 BundleA 包含一项服务。 BundleB 包含 ServiceTracker。

在我看来,只有当bundleB先于BundleA启动时,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)时 - 一切正常并且添加了服务(我看到# Service was added消息)。当我在bundleA(pax-logging-service)之后启动bundleB(mybundle)时 - 没有任何效果,并且永远不会添加服务(即使在一分钟后我也看不到 # Service was added 消息)。

最佳答案

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

关于java - ServiceTracker 找到哪些服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43560233/

相关文章:

eclipse - 插件中何时需要 Activator 类/"Bundle-Activator",何时不需要?

java - OSGi 中的 Apache Jena 与 Glassfish - ClassCastException

java - 在 Karaf 中启动 bundle 时出现 OSGi os.wiring.package 错误

java - 从 OSGI 命令提示符运行 OSGI bundle :Import-package missing constraint

java - OSGi 服务的 ProgressMonitor

java - 如何在 Spring Integration 中从 TCP 读取流(消息)

Java 8 流到文件

java - 输出数组列表的内容

XML SOAP 消息的 Java HTTP post

java - Eclipse 没有启动