`
raymond.chen
  • 浏览: 1437260 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

服务跟踪(ServiceTracker)

    博客分类:
  • OSGi
阅读更多

当多个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实例(服务注册、引用、跟踪)

    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