`
snoopy7713
  • 浏览: 1146809 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

服务跟踪(ServiceTracker)

    博客分类:
  • OSGi
阅读更多

当多个Bundle使用同一接口名注册服务时,服务的获取策略如下:OSGi容器会返回排行最高的服务,即,返回注册时SERVICE_RANKING属性值最大的服务。如果有多个服务的排行值相等,那么OSGi容器将返回PID值最小的那个服务。

 

如果服务消费者需要对服务进行跟踪,比如服务何时被注册,何时取消注册等,可以使用ServiceTracker类。以下是该类的使用范例源码:

 

1、接口及其实现类:

Java代码  收藏代码
  1. public   interface  HelloService {  
  2.     public  String sayHello(String name);  
  3. }  

 

Java代码  收藏代码
  1. public   class  HelloServiceImpl  implements  HelloService {  
  2.     public  String sayHello(String name) {  
  3.         return   "Hello "  + name;  
  4.     }  
  5. }  

 

2、服务跟踪器子类

Java代码  收藏代码
  1. /**  
  2.  * 服务跟踪器:跟踪注册到HelloService接口下的所有服务  
  3.  */   
  4. public   class  HelloServiceTracker  extends  ServiceTracker {  
  5.     public  HelloServiceTracker(BundleContext context){  
  6.         super (context, HelloService. class .getName(),  null );  
  7.     }  
  8.       
  9.     @Override   
  10.     public  Object addingService(ServiceReference reference) {  
  11.         System.out.println("adding service: "  + reference.getBundle().getSymbolicName());  
  12.         return   super .addingService(reference);  
  13.     }  
  14.   
  15.     @Override   
  16.     public   void  removedService(ServiceReference reference, Object service) {  
  17.         System.out.println("removed service: "  + reference.getBundle().getSymbolicName());  
  18.         super .removedService(reference, service);  
  19.     }  
  20. }  

 

3、Bundle激活器类

Java代码  收藏代码
  1. public   class  Activator  implements  BundleActivator {  
  2.     HelloServiceTracker helloServiceTracker;  
  3.     ServiceRegistration serviceRegistration;  
  4.       
  5.     public   void  start(BundleContext context)  throws  Exception {  
  6.         System.out.println("start..." );  
  7.           
  8.         //启动服务跟踪器   
  9.         helloServiceTracker = new  HelloServiceTracker(context);  
  10.         helloServiceTracker.open();  
  11.           
  12.         //注册服务   
  13.         serviceRegistration = context.registerService(HelloService.class .getName(),  new  HelloServiceImpl(),  null );  
  14.           
  15.         //获取被跟踪的服务   
  16.         HelloService helloService =  (HelloService)helloServiceTracker.getService();  
  17.         if (helloService!= null ){  
  18.             System.out.println(helloService.sayHello("cjm" ));  
  19.         }  
  20.     }  
  21.   
  22.     public   void  stop(BundleContext context)  throws  Exception {  
  23.         System.out.println("stop" );  
  24.           
  25.         //关闭服务跟踪器   
  26.         helloServiceTracker.close();  
  27.     
  28.         serviceRegistration.unregister();  
  29.     }  
  30. }  

 

4、运行结果

osgi>
start...
adding service: p1
Hello cjm


osgi> stop 86
stop
removed service: p1

 

分享到:
评论

相关推荐

    osgi实例(服务注册、引用、跟踪)

    OSGi的`ServiceTracker`类提供了一种方便的方式来跟踪服务的生命周期。开发者可以创建一个`ServiceTracker`实例,指定要跟踪的服务类型。`ServiceTracker`会自动监听服务的添加、修改和删除事件。当服务出现变化时,...

    OSGI的消息机制及注册服务

    ServiceTracker会自动管理和跟踪服务的生命周期,当服务可用或不可用时,它会触发回调。lookupService则提供了一种简单的按名称查找服务的方法,但不支持服务变化的跟踪。 在RCP(Rich Client Platform)场景中,...

    OSGi常用服务发布和获取方式总结

    它监听服务的生命周期事件,并根据配置的过滤器自动跟踪和管理服务。当服务可用时,`ServiceTracker`会缓存服务,方便消费者快速访问。 2. **ServiceReference**: 通过`ServiceTracker`或其他方式获取到`Service...

    OSGi service

    开发人员可以使用服务跟踪器(ServiceTracker)来监控服务的生命周期,避免因服务的动态变化导致的问题。服务跟踪器允许自定义回调,以便在服务添加、更改或移除时执行特定操作。 服务环境中的bundle上下文(Bundle ...

    osgi与equinox 创建高度模块化的java系统 第6章源码

    7. **最佳实践**:除了理论知识,本章可能还会分享一些关于如何优化服务跟踪和DS使用,以提高性能和可维护性的最佳实践。 通过学习这些内容,开发者能够更好地理解和掌握OSGi与Equinox的核心特性,从而构建更加灵活...

    osgi学习笔记(三)

    例如,研究`org.osgi.framework.ServiceRegistration`接口和`org.osgi.util.tracker.ServiceTracker`类的实现,能帮助我们更好地掌握OSGi服务的运作原理。 ## 工具支持 在实际开发中,有一些工具和库能简化OSGi服务...

    OSGi与Equinox 创建高度模块化的Java系统 第4章完整源码

    5. **依赖注入**:了解OSGi中的服务跟踪器(ServiceTracker)和服务监听器(ServiceListener),以及如何利用它们来实现依赖注入,以实现对服务变化的响应。 6. **打包与部署**:学习如何将源代码打包成OSGi bundle...

    konpflerfish konpflerfish tutorial

    - **ServiceTrackerActivator.java**:使用 ServiceTracker 跟踪服务。 #### 7. 参考资料 - [OSGi 官方网站](http://www.osgi.org/) - [Knopflerfish 官方网站](http://www.knopflerfish.org/) - [OSGi 入门教程]...

    osgi session共享 支持springmvc 配置个filter即可

    此外,由于Karaf是一个基于OSGi的服务容器,我们可能还需要考虑ServiceTracker或者Declarative Services(DS)来动态跟踪和管理Session共享Filter。ServiceTracker可以帮助我们在运行时自动检测到其他Bundle对...

    一个简单的java分布式实例

    这通常涉及到使用ServiceTracker或者 declarative services来动态跟踪和获取服务实例。 在实际操作中,开发者会创建一个配置文件(如MANIFEST.MF),在其中定义bundle的元数据,包括导出和导入的包、依赖的服务以及...

    equinox快速入门

    `ServiceTracker`或`ServiceReference`可以帮助你跟踪服务的状态,并获取服务实例。 4. **生命周期管理**:在OSGi中,bundle有自己的生命周期,包括启动、运行、停止和卸载等状态。你需要处理这些状态的变化,比如...

    OSGI-R4 规范-中文

    - **ServiceTracker**: 用于跟踪服务的注册和注销事件。 #### 三、关键概念解析 为了更好地理解OSGi R4的核心功能,以下是一些关键概念的深入解析: ##### 1. 模块化 - **模块独立性**: OSGi通过严格的模块边界...

    OSGI 经典实例,入门

    2. **服务注册与查找**:学习如何使用ServiceTracker和服务监听器来查找和跟踪服务,以及如何使用ServiceRegistration来注册服务。 3. **包导入与导出**:了解Import-Package和Export-Package头,它们定义了bundle...

    OSGi动态部署案例

    例如,我们可以使用`ServiceRegistry`来注册服务,并使用`ServiceTracker`来跟踪观察者服务的生命周期。 当一个新的观察者需要添加到系统时,我们只需要在对应的bundle中创建这个观察者实例,然后将其注册为OSGi...

    osgi注册servlet.pdf

    通常,这会在插件的激活器(Activator)类中完成,通过跟踪服务来监听HttpService的可用性。一旦获取到HttpService,就可以调用它的`registerServlet()`方法,指定Servlet类和对应的URL映射。 例如,`...

Global site tag (gtag.js) - Google Analytics