当多个Bundle使用同一接口名注册服务时,服务的获取策略如下:OSGi容器会返回排行最高的服务,即,返回注册时SERVICE_RANKING属性值最大的服务。如果有多个服务的排行值相等,那么OSGi容器将返回PID值最小的那个服务。
如果服务消费者需要对服务进行跟踪,比如服务何时被注册,何时取消注册等,可以使用ServiceTracker类。以下是该类的使用范例源码:
1、接口及其实现类:
public interface HelloService {
public String sayHello(String name);
}
public class HelloServiceImpl implements HelloService {
public String sayHello(String name) {
return "Hello " + name;
}
}
2、服务跟踪器子类
/**
* 服务跟踪器:跟踪注册到HelloService接口下的所有服务
*/
public class HelloServiceTracker extends ServiceTracker {
public HelloServiceTracker(BundleContext context){
super(context, HelloService.class.getName(), null);
}
@Override
public Object addingService(ServiceReference reference) {
System.out.println("adding service: " + reference.getBundle().getSymbolicName());
return super.addingService(reference);
}
@Override
public void removedService(ServiceReference reference, Object service) {
System.out.println("removed service: " + reference.getBundle().getSymbolicName());
super.removedService(reference, service);
}
}
3、Bundle激活器类
public class Activator implements BundleActivator {
HelloServiceTracker helloServiceTracker;
ServiceRegistration serviceRegistration;
public void start(BundleContext context) throws Exception {
System.out.println("start...");
//启动服务跟踪器
helloServiceTracker = new HelloServiceTracker(context);
helloServiceTracker.open();
//注册服务
serviceRegistration = context.registerService(HelloService.class.getName(), new HelloServiceImpl(), null);
//获取被跟踪的服务
HelloService helloService = (HelloService)helloServiceTracker.getService();
if(helloService!=null){
System.out.println(helloService.sayHello("cjm"));
}
}
public void stop(BundleContext context) throws Exception {
System.out.println("stop");
//关闭服务跟踪器
helloServiceTracker.close();
serviceRegistration.unregister();
}
}
4、运行结果
osgi>
start...
adding service: p1
Hello cjm
osgi> stop 86
stop
removed service: p1
分享到:
相关推荐
OSGi的`ServiceTracker`类提供了一种方便的方式来跟踪服务的生命周期。开发者可以创建一个`ServiceTracker`实例,指定要跟踪的服务类型。`ServiceTracker`会自动监听服务的添加、修改和删除事件。当服务出现变化时,...
ServiceTracker会自动管理和跟踪服务的生命周期,当服务可用或不可用时,它会触发回调。lookupService则提供了一种简单的按名称查找服务的方法,但不支持服务变化的跟踪。 在RCP(Rich Client Platform)场景中,...
它监听服务的生命周期事件,并根据配置的过滤器自动跟踪和管理服务。当服务可用时,`ServiceTracker`会缓存服务,方便消费者快速访问。 2. **ServiceReference**: 通过`ServiceTracker`或其他方式获取到`Service...
开发人员可以使用服务跟踪器(ServiceTracker)来监控服务的生命周期,避免因服务的动态变化导致的问题。服务跟踪器允许自定义回调,以便在服务添加、更改或移除时执行特定操作。 服务环境中的bundle上下文(Bundle ...
7. **最佳实践**:除了理论知识,本章可能还会分享一些关于如何优化服务跟踪和DS使用,以提高性能和可维护性的最佳实践。 通过学习这些内容,开发者能够更好地理解和掌握OSGi与Equinox的核心特性,从而构建更加灵活...
例如,研究`org.osgi.framework.ServiceRegistration`接口和`org.osgi.util.tracker.ServiceTracker`类的实现,能帮助我们更好地掌握OSGi服务的运作原理。 ## 工具支持 在实际开发中,有一些工具和库能简化OSGi服务...
5. **依赖注入**:了解OSGi中的服务跟踪器(ServiceTracker)和服务监听器(ServiceListener),以及如何利用它们来实现依赖注入,以实现对服务变化的响应。 6. **打包与部署**:学习如何将源代码打包成OSGi bundle...
- **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对...
这通常涉及到使用ServiceTracker或者 declarative services来动态跟踪和获取服务实例。 在实际操作中,开发者会创建一个配置文件(如MANIFEST.MF),在其中定义bundle的元数据,包括导出和导入的包、依赖的服务以及...
`ServiceTracker`或`ServiceReference`可以帮助你跟踪服务的状态,并获取服务实例。 4. **生命周期管理**:在OSGi中,bundle有自己的生命周期,包括启动、运行、停止和卸载等状态。你需要处理这些状态的变化,比如...
- **ServiceTracker**: 用于跟踪服务的注册和注销事件。 #### 三、关键概念解析 为了更好地理解OSGi R4的核心功能,以下是一些关键概念的深入解析: ##### 1. 模块化 - **模块独立性**: OSGi通过严格的模块边界...
2. **服务注册与查找**:学习如何使用ServiceTracker和服务监听器来查找和跟踪服务,以及如何使用ServiceRegistration来注册服务。 3. **包导入与导出**:了解Import-Package和Export-Package头,它们定义了bundle...
例如,我们可以使用`ServiceRegistry`来注册服务,并使用`ServiceTracker`来跟踪观察者服务的生命周期。 当一个新的观察者需要添加到系统时,我们只需要在对应的bundle中创建这个观察者实例,然后将其注册为OSGi...
通常,这会在插件的激活器(Activator)类中完成,通过跟踪服务来监听HttpService的可用性。一旦获取到HttpService,就可以调用它的`registerServlet()`方法,指定Servlet类和对应的URL映射。 例如,`...