OSGIシリーズサービス登録

2364 ワード

以前はblueprintでどのようにサービスを公開(登録)し、サービスを取得するかを話していましたが、コードで私たちのサービスを公開(登録)し、サービスを取得する方法についてお話しします.
前提として、OSGI環境の依存パッケージを導入する必要があります.
一、発行(登録)サービス
1、まず、サービスインタフェースと実装を作成します.
サービスインタフェース:IService 1.java
サービスインタフェース:Services 1.java
2、それから、サービス登録用のActivatorクラスを書きます.
public class Activator {
    protected static final Logger logger = LoggerFactory.getLogger(Activator.class);

    private BundleContext bundleContext;
    private Service1 service1;
    private Service2 service2;
    private ServiceRegistration serviceServiceRegistration;

    public void start() {
        Dictionary<String, String> properties = new Hashtable<>();
        properties.put("service.exported.interfaces","*");
        properties.put("service.exported.configs","service.rpc");
        serviceServiceRegistration =  bundleContext.registerService(Service1.class.getName(), service1, properties);
        serviceServiceRegistration =  bundleContext.registerService(Service2.class.getName(), service2, properties);
        logger.info("Score core started");
    }

    public void stop() {
        serviceServiceRegistration.unregister();
    }

    public void setBundleContext(BundleContext bundleContext) {
        this.bundleContext = bundleContext;
    }
    public void setService1(Service1 service1) {
        this.service1 = service1;
    }
    public void setService2(Service2 service2) {
        this.service2 = service2;
    }
    
    
}

二、サービスの取得
1、方式一(推薦)
ServiceTracker tracker = new ServiceTracker(context, Service1.class.getName(), null);
	tracker.open();
	Service1 service = (Service1) tracker.getService();
	if(service!=null)
	service.log(Service1.LOG_INFO,"ok");
	//     Service
	Object[] services = tracker.getServices();
	//   Service   
	int count = tracker.getTrackingCount();
	tracker.close();

2、方式二(オリジナル)
//   Service  
	ServiceReference ref = context.getServiceReference(LogService.class.getName());
	if(ref!=null)
	{
		//   Service  
		Service1 service = (Service1) context.getService(ref);
		if (service != null) {
			//   Service  
			service.log(Service1.LOG_INFO, "ok");
			//   Service,            Service  
			context.ungetService(ref);
		}
	}