OSGI serviceChanged方法

时间:2017-12-01 15:31:03

标签: java service osgi apache-felix

我正在编写一个系统,让用户可以插入自己的代码来监控传感器。

我想编写一个基本侦听器来侦听其他bundle中的更改。我遇到了ServiceListener,这似乎对我的事业很方便。我的问题是:何时调用ServiceListener中的serviceChanged()?我一直在网上寻找,但找不到任何东西。

非常感谢!

package be.pxl.smartcampus.MonitorListener;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceEvent;
import be.pxl.smartcampus.util.Monitor;
import be.pxl.smartcampus.util.Data;

public class Activator implements BundleActivator, ServiceListener {

    public void start(BundleContext context) {
        context.addServiceListener(this);
    }

    public void stop(BundleContext context) {
        context.removeServiceListener(this);
    }

    public void serviceChanged(ServiceEvent event) {
        if (event.getType() == ServiceEvent.MODIFIED) {
            Monitor monitor = (Monitor) (event.getServiceReference());
            Data data = monitor.getData();
            System.out.println("SERVICE CHANGED CALLED");
            // TO DO: MAKE API CALL
        }
    }
}

import be.pxl.smartcampus.util.Data;
import be.pxl.smartcampus.util.Monitor;
import org.osgi.framework.BundleContext;

import java.util.Hashtable;

public class Activator extends Monitor {

    private Data data = new Data();
    private Hashtable<String, Data> hash = new Hashtable<String, Data>();

    public void start(BundleContext bundleContext) {
        hash.put("first", data);
        bundleContext.registerService(Activator.class.getName(), this, hash);
        changeData();
    }

    private void changeData() {
        hash.put("second", data);
    }

    public void stop(BundleContext bundleContext) {

    }
}

2 个答案:

答案 0 :(得分:1)

仅更改某些HashTable的内容是不够的。您必须在setProperties对象上调用ServiceRegistration

答案 1 :(得分:0)

您在这里混合了两个概念 - 捆绑和服务。

Bundles是具有生命周期的Jar文件(可以动态安装,解析,启动,停止和卸载)。如果要跟踪捆绑生命周期,则需要创建BundleListener,在捆绑生命周期事件发生时将调用该Extender Pattern

或者,如果您只需要对包含特殊信息的特定包(特殊文件,MANIFEST.MF中的特殊条目,......)执行某些操作,您可以使用ServiceListener

服务是位于捆绑包内的组件(类),这些组件在OSGi服务注册表中注册,因此其他服务可以找到并使用它们。服务具有自己的生命周期(可以启动,停止,...)如果要跟踪服务生命周期事件,则需要实现并注册ServiceEvent它将在服务生命周期事件发生时被调用(服务启动时,停了,...)。 Whiteboard Pattern包含有关导致事件的实际服务和更改类型的信息。

或者,如果您只关心使用特定类型的服务,可以使用{{3}}。