首页 > 代码库 > osgi实战学习之路:6. Service-1

osgi实战学习之路:6. Service-1

什么是Service?


它是注册到osgi的一个java对象


Service注册:


通过BundleContext::registerService(java.lang.String[] clazzes, java.lang.Object service, java.util.Dictionary properties) 


Service查找及使用:


通过BundleContext::getServiceReference(java.lang.String clazz),返回ServiceReference
通过BundleContext::getService(ServiceReference reference) ,返回注册的服务对象


Service释放:


通过BundleContext::ungetService(ServiceReference reference) 



LADP:


 轻量级目录访问协议(Lightweight Directory Access Protocol)



1个Service对应一个实现类的注册与使用demo:


服务提供者:

student-manage/IStudentManage.java

package com.demo.service;

public interface IStudentManage {
	void add();
}


student-manage/Activator.java

package com.demo.service;

import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import com.demo.service.impl.StudentManage;

public class Activator implements BundleActivator {

	public void start(BundleContext context) throws Exception {
		System.out.println("注册服务开始....");
		context.registerService(IStudentManage.class.getName(),
				new StudentManage(), null);
		System.out.println("注册服务结束....");
	}

	public void stop(BundleContext context) throws Exception {

	}

}

服务使用者:

student-action/Activator.java

package com.demo.action;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

import com.demo.service.IStudentManage;


public class Activator implements BundleActivator{
	public void start(BundleContext context) throws Exception {
		System.out.println("action  begin...");
		ServiceReference sf=null;
		try {
			//查找Service
			sf=context.getServiceReference(IStudentManage.class.getName());
			//调用服务
			IStudentManage studentManage = (IStudentManage)context.getService(sf);
			studentManage.add();
		} finally {
			context.ungetService(sf);
		}
		System.out.println("action  end...");
	}

	public void stop(BundleContext context) throws Exception {
	}

}

部署至karaf并查看结果:




一个Service对应多个实现(基于LDAP)demo2


服务提供者

student-manage/Activator.java

package com.demo.service;

import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import com.demo.service.impl.StudentManageA;
import com.demo.service.impl.StudentManageB;

public class Activator implements BundleActivator {

	public void start(BundleContext context) throws Exception {
		System.out.println("注册服务开始....");
		//注册A
		Hashtable<String, String> dict=new Hashtable<String, String>();
		dict.put("name", "a");
		context.registerService(IStudentManage.class.getName(),
				new StudentManageA(), dict);
		//注册B
		dict=new Hashtable<String, String>();
		dict.put("name", "b");
		context.registerService(IStudentManage.class.getName(),
				new StudentManageB(), dict);
		System.out.println("注册服务结束....");
	}

	public void stop(BundleContext context) throws Exception {

	}

}

服务使用者

student-action/Activator.java

package com.demo.action;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceReference;

import com.demo.service.IStudentManage;


public class Activator implements BundleActivator{
	public void start(BundleContext context) throws Exception {
		System.out.println("action  begin...");
		ServiceReference[] references=null;
		try {
			System.out.println("服务调用------------------");
			//查找Service
			String filter="(name=b)";
			references=context.getServiceReferences(IStudentManage.class.getName(), filter);
			//调用服务
			if(references.length==1){
				IStudentManage studentManage = (IStudentManage)context.getService(references[0]);
				studentManage.add();
			}else {
				throw new IllegalArgumentException("IStudentManage查找到多个实现类");
			}
			
		} finally {
			for(ServiceReference sf:references){
				context.ungetService(sf);
			}
			
		}
		System.out.println("action  end...");
	}

	public void stop(BundleContext context) throws Exception {
	}

}

部署到karaf及查看结果: