【问题标题】:OSGI serviceChanged methodOSGI serviceChanged 方法
【发布时间】:2017-12-01 15:31:02
【问题描述】:

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

我想编写一个基本的监听器来监听其他包的变化。我遇到了对我的事业来说似乎很方便的 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) {

    }
}

【问题讨论】:

    标签: java service osgi apache-felix


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      Bundle 是具有生命周期的 Jar 文件(可以动态安装、解析、启动、停止和卸载)。如果要跟踪捆绑生命周期,您需要创建一个BundleListener,当捆绑生命周期事件发生时将调用它。

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

      服务是存在于捆绑包中的组件(类),它们在 OSGi 服务注册表中注册,以便其他服务可以找到并使用它们。服务有自己的生命周期(可以启动,停止,...)如果你想跟踪一个服务生命周期事件你需要实现并注册ServiceListener它会在服务生命周期事件发生时被调用(服务启动,停止, ...)。 ServiceEvent 包含有关导致事件的实际服务和更改类型的信息。

      或者,如果您只想对特定类型的服务做某事,您可以使用Whiteboard Pattern

      【讨论】:

      • 感谢您的回答!我正在使用 serviceListeners 但它不起作用。我已经编辑了我的问题。如您所见,我想在修改道具时执行一些代码。但是当 hash.put("second", data) 被执行时,serviceChanged 事件没有被调用?
      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多