zoukankan      html  css  js  c++  java
  • 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及查看结果:




  • 相关阅读:
    硬盘参数你都懂吗?(上)-从案例引发的讨论
    Python 面试题(下)
    Python 面试题(上)
    DNS 原理入门
    从硬盘设计思想到RAID改良之道
    (转)短信vs.推送通知vs.电子邮件:app什么时候该用哪种方式来通知用户?
    (转)移动端主动推送消息原理
    (转)OpenFire源码学习之十七:HTTP Service插件
    (转)openfire插件开发(二) 基于web的插件开发
    (转)openfire插件开发(一)
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6734965.html
Copyright © 2011-2022 走看看