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及查看结果:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值