如果您的服务消费者需要了解某一接口下的服务对象何时注册、何时取消注册,这时,您应使用
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发生变化时被触发,比较适合热插拔。
分享到:
相关推荐
1. **ServiceTracker**: `ServiceTracker`是OSGi中获取服务的主要工具。它监听服务的生命周期事件,并根据配置的过滤器自动跟踪和管理服务。当服务可用时,`ServiceTracker`会缓存服务,方便消费者快速访问。 2. **...
1. **ServiceTracker**:ServiceTracker是OSGi服务模型的核心部分,它允许一个组件追踪和管理其他服务的生命周期。通过ServiceTracker,组件可以注册对特定服务的兴趣,并在服务出现、更改或消失时得到通知,从而...
当服务出现变化时,`ServiceTracker`会调用预定义的回调方法,如`addingService()`, `modifiedService()`, 和`removedService()`,使组件能够响应服务的变化。 在提供的实例中,你将看到如何创建和使用这些概念的...
但是,这种方式也存在一些缺点,如:Bundle stop 以后,Bundle 内 open 的 ServiceTracker 不会自动关闭。因此,这种方式不推荐使用。 4. DS(Declarative Service)方式 DS(Declarative Service)方式是 OSGi ...
在OSGI中,一个常见的实现是使用ServiceTracker,这是一个工具类,允许bundle跟踪特定类型的服务并处理其生命周期事件。当一个bundle需要发送消息时,它可以发布一个服务,其他bundle则可以订阅这个服务来接收消息。...
httpServiceTracker = new ServiceTracker(context, HttpService.class, null); httpServiceTracker.open(); httpServiceTracker.waitForService(1000); // 等待服务最多1秒 HttpService httpService = ...
- **ServiceTrackerActivator.java**:使用 ServiceTracker 跟踪服务。 #### 7. 参考资料 - [OSGi 官方网站](http://www.osgi.org/) - [Knopflerfish 官方网站](http://www.knopflerfish.org/) - [OSGi 入门教程]...
此外,由于Karaf是一个基于OSGi的服务容器,我们可能还需要考虑ServiceTracker或者Declarative Services(DS)来动态跟踪和管理Session共享Filter。ServiceTracker可以帮助我们在运行时自动检测到其他Bundle对...
1. **查找服务**:通过`BundleContext.getServiceReferences()`或`ServiceTracker`等方法获取服务引用。 2. **获取服务**:使用`BundleContext.getService()`或`ServiceTracker.getService()`获取服务实例。 3. **...
这通常涉及到使用ServiceTracker或者 declarative services来动态跟踪和获取服务实例。 在实际操作中,开发者会创建一个配置文件(如MANIFEST.MF),在其中定义bundle的元数据,包括导出和导入的包、依赖的服务以及...
5. **依赖注入**:了解OSGi中的服务跟踪器(ServiceTracker)和服务监听器(ServiceListener),以及如何利用它们来实现依赖注入,以实现对服务变化的响应。 6. **打包与部署**:学习如何将源代码打包成OSGi bundle...
理解服务接口和实现,以及如何使用ServiceTracker进行服务监听是重要的技能。 4. **生命周期管理**:如何编写可动态部署和更新的bundle,包括bundle的启动脚本、生命周期回调方法(如start()、stop())等。 5. **...
开发人员可以使用服务跟踪器(ServiceTracker)来监控服务的生命周期,避免因服务的动态变化导致的问题。服务跟踪器允许自定义回调,以便在服务添加、更改或移除时执行特定操作。 服务环境中的bundle上下文(Bundle ...
例如,我们可以使用`ServiceRegistry`来注册服务,并使用`ServiceTracker`来跟踪观察者服务的生命周期。 当一个新的观察者需要添加到系统时,我们只需要在对应的bundle中创建这个观察者实例,然后将其注册为OSGi...
这涉及到`ServiceReference`和`ServiceTracker`等API的使用。 3. **生命周期管理**:每个bundle都有启动、停止、安装和更新等状态。例子中会演示如何控制bundle的生命周期,例如通过`BundleContext`调用`start()`和...
3. **定义服务**:如果需要提供或消费OSGi服务,需在MANIFEST.MF文件中声明,并通过ServiceTracker或其他API管理服务的生命周期。 4. **构建和部署**:Eclipse可以自动构建OSGi Bundle,生成`.jar`文件。在Equinox...
例如,研究`org.osgi.framework.ServiceRegistration`接口和`org.osgi.util.tracker.ServiceTracker`类的实现,能帮助我们更好地掌握OSGi服务的运作原理。 ## 工具支持 在实际开发中,有一些工具和库能简化OSGi服务...
例如,如果需要使用UserService,可以创建一个ServiceTracker组件,该组件在Tapestry页面初始化时自动获取ApplicationContext并注入所需的Bean: ```java public class MyPage extends Page { private UserService...
每个服务都有一个唯一的标识,模块可以通过ServiceTracker或者监听ServiceEvent来获取和使用服务,实现松耦合。 4. **动态性**:OSGi的一大优势是其动态性。模块可以在运行时安装、更新和卸载,这使得开发者可以...