服务跟踪(ServiceTracker)

当多个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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值