`

ServiceTracker 的作用

阅读更多

如果您的服务消费者需要了解某一接口下的服务对象何时注册、何时取消注册,这时,您应使用 ServiceTracker 类:

 

下面,我们看看如何使用 服务跟踪器来修改我们的示例代码,具体步骤如下。

1) 修改HelloWorldBundle的MANIFEST.MF文件,让它导入org.osgi .util.tracker包;

2) 新建类HelloServiceTracker.java,其源代码参见清单11。

源代码清单11.HelloServiceTracker.java

public class HelloServiceTracker extends ServiceTracker {  
 
    public HelloServiceTracker(BundleContext context) {  
 
        super(context, HelloService.class.getName(),null);  
 
    }  
 
    public Object addingService(ServiceReference reference) {  
 
        System.out.println("Inside HelloServiceTracker.addingService " + reference.getBundle());  
 
        return super.addingService(reference);  
 
    }  
 
    public void removedService(ServiceReference reference, Object service) {  
 
        System.out.println("Inside HelloServiceTracker.removedService " + reference.getBundle());  
 
        super.removedService(reference, service);  
 
    }  
 
}  
 

在上面的HelloSerivceTracker类的构造函数中,您可以看到,我们把HelloService接口名传入其父类中,这相当于 说,HelloServiceTracker应跟踪注册到HelloService接口名下的所有服务,HelloServiceTracker继承自ServiceTracker 类,实现了下面两个方法:

a) addingService()方法:当Bundle使用 接口名注册服务时,该方法将会被调用;

b)removedService()方法:当Bundle取消注册某个接口名下的服务时,该方法将会被调用。

3) 用HelloServiceTracker类更新我们的Activator.java类,以便让它来管理服务,而不是直接去查找它们,源代码请参见清单12。

源代码清单12. 使用 了HelloServiceTracker的Activator.java

public class Activator implements BundleActivator {  
 
    HelloServiceTracker helloServiceTracker;  
 
    public void start(BundleContext context) throws Exception {  
 
        System.out.println("Hello World!!");  
 
        helloServiceTracker= new HelloServiceTracker(context);  
 
        helloServiceTracker.open();  
 
        HelloService helloService = (HelloService)helloServiceTracker.getService();  
 
        System.out.println(helloService.sayHello());  
 
   
 
    }  
 
    public void stop(BundleContext context) throws Exception {  
 
        System.out.println("Goodbye World!!");  
 
        helloServiceTracker.close();  
 
    }  
 
} 
 

我们看到,在初始的start()方法中,我们首先新建一个HelloServiceTracker对象,然后要求这个对象跟踪HelloService接口下的服务。这时,我们可以调用getService()方法获得HelloService对象。

如果您试运行上面的示例代码,您会注意到,在启动或停止HelloSerivceBundle时,OSGi 容器都会调用HelloServiceTracker对象的addingService()方法或removedService()方法。

 

总结: 由此可见ServiceTracker与context.getService(reference)的最大区别是,ServcieTracker封装了ServiceListener可以在Service发生变化时被触发,比较适合热插拔。

 

分享到:
评论

相关推荐

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

    1. **ServiceTracker**: `ServiceTracker`是OSGi中获取服务的主要工具。它监听服务的生命周期事件,并根据配置的过滤器自动跟踪和管理服务。当服务可用时,`ServiceTracker`会缓存服务,方便消费者快速访问。 2. **...

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

    1. **ServiceTracker**:ServiceTracker是OSGi服务模型的核心部分,它允许一个组件追踪和管理其他服务的生命周期。通过ServiceTracker,组件可以注册对特定服务的兴趣,并在服务出现、更改或消失时得到通知,从而...

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

    当服务出现变化时,`ServiceTracker`会调用预定义的回调方法,如`addingService()`, `modifiedService()`, 和`removedService()`,使组件能够响应服务的变化。 在提供的实例中,你将看到如何创建和使用这些概念的...

    osgi服务发布和获取方式

    但是,这种方式也存在一些缺点,如:Bundle stop 以后,Bundle 内 open 的 ServiceTracker 不会自动关闭。因此,这种方式不推荐使用。 4. DS(Declarative Service)方式 DS(Declarative Service)方式是 OSGi ...

    OSGI的消息机制及注册服务

    在OSGI中,一个常见的实现是使用ServiceTracker,这是一个工具类,允许bundle跟踪特定类型的服务并处理其生命周期事件。当一个bundle需要发送消息时,它可以发布一个服务,其他bundle则可以订阅这个服务来接收消息。...

    osgi注册servlet.pdf

    httpServiceTracker = new ServiceTracker(context, HttpService.class, null); httpServiceTracker.open(); httpServiceTracker.waitForService(1000); // 等待服务最多1秒 HttpService httpService = ...

    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对...

    SpringDM笔记13-OSGi服务注册与引用

    1. **查找服务**:通过`BundleContext.getServiceReferences()`或`ServiceTracker`等方法获取服务引用。 2. **获取服务**:使用`BundleContext.getService()`或`ServiceTracker.getService()`获取服务实例。 3. **...

    一个简单的java分布式实例

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

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

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

    OSGI 开发文档中文的

    理解服务接口和实现,以及如何使用ServiceTracker进行服务监听是重要的技能。 4. **生命周期管理**:如何编写可动态部署和更新的bundle,包括bundle的启动脚本、生命周期回调方法(如start()、stop())等。 5. **...

    OSGi service

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

    OSGi动态部署案例

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

    OSGI参考例子程序

    这涉及到`ServiceReference`和`ServiceTracker`等API的使用。 3. **生命周期管理**:每个bundle都有启动、停止、安装和更新等状态。例子中会演示如何控制bundle的生命周期,例如通过`BundleContext`调用`start()`和...

    基于Eclipse的Equinox框架开发OSGi Bundle应用

    3. **定义服务**:如果需要提供或消费OSGi服务,需在MANIFEST.MF文件中声明,并通过ServiceTracker或其他API管理服务的生命周期。 4. **构建和部署**:Eclipse可以自动构建OSGi Bundle,生成`.jar`文件。在Equinox...

    osgi学习笔记(三)

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

    将Tapestry整合到Spring里去.doc

    例如,如果需要使用UserService,可以创建一个ServiceTracker组件,该组件在Tapestry页面初始化时自动获取ApplicationContext并注入所需的Bean: ```java public class MyPage extends Page { private UserService...

    Eclipse-OSGi内核源码分析

    每个服务都有一个唯一的标识,模块可以通过ServiceTracker或者监听ServiceEvent来获取和使用服务,实现松耦合。 4. **动态性**:OSGi的一大优势是其动态性。模块可以在运行时安装、更新和卸载,这使得开发者可以...

Global site tag (gtag.js) - Google Analytics