监听OSGi服务

方法一:实现ServiceListener接口:

package org.riawork.demo.web;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;

public class Activator implements BundleActivator, ServiceListener {

    private BundleContext ctx;
    private ServiceReference ref;
    
    public void start(BundleContext context) throws Exception {
        System.out.println("Hello World-Web!!");
        this.ctx = context;
        context.addServiceListener(this, "(&(objectClass=" + HttpService.class.getName() + "))");
    }

    public void stop(BundleContext context) throws Exception {
        System.out.println("Goodbye World-Web!!");
    }

    @Override
    public void serviceChanged(ServiceEvent event) {
        ref = ctx.getServiceReference(HttpService.class.getName());
        HttpService http = (HttpService) ctx.getService(ref);
        
        switch (event.getType()) {
            case ServiceEvent.REGISTERED:
                try {
                    http.registerResources("/demo/page", "page", null);
                    System.out.println("请通过/demo/page/login.htm访问");
                } catch (NamespaceException e) {
                    e.printStackTrace();
                }
                break;
                
            case ServiceEvent.UNREGISTERING:
                http.unregister("/demo/page");
                System.out.println("已卸载web模块!");
                break;
        }
    }
}


方式二:继承ServiceTracker基类:

package org.riawork.demo.web;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;

public class Activator implements BundleActivator, ServiceListener {

    private BundleContext ctx;
    private ServiceReference ref;
    private LocalTracker tracker;
    
    public void start(BundleContext context) throws Exception {
        System.out.println("Hello World-Web!!");
        this.ctx = context;
        this.tracker = new LocalTracker(context);
        this.tracker.open();
        context.addServiceListener(this, "(&(objectClass=" + HttpService.class.getName() + "))");
    }

    public void stop(BundleContext context) throws Exception {
        this.tracker.close();
        this.tracker = null;
        System.out.println("Goodbye World-Web!!");
    }

    private class LocalTracker extends ServiceTracker {
        public LocalTracker(BundleContext context) {
            super(context, HttpService.class.getName(), null);
        }
        
        public Object addingService(ServiceReference ref) {
            HttpService http = (HttpService) context.getService(ref);
            try {
                http.registerResources("/demo/page", "page", null);
                System.out.println("请通过/demo/page/login.htm访问");
            } catch (NamespaceException e) {
                e.printStackTrace();
            }
            return http;
        }
        
        public void removedService(ServiceReference ref, Object service) {
            HttpService http = (HttpService) service;
            http.unregister("/demo/page");
            super.removedService(ref, service);
            System.out.println("已卸载web模块!");
        }
    }
}
原文地址:https://www.cnblogs.com/eastson/p/3624806.html