在osgi容器外应用osgi bundle提供的服务

 任何系统都不是孤立存在的,都有一个持续发展的过程,在java技术的应用中,osgi的理念提出,从机制上解决了java中模块化的问题,使得Java真正能够实现模块化的开发。但是,在osgi之前,已经存在了很多的系统和各种不同的框架技术,每一个都有自己的使用范围和优点,osgi一方面不可能覆盖所有以前平台和框架提供的各种功能,另一方面传统的系统也不可能因为osgi的出现,进行完成的重构,因此osgi bundle和传统系统之间的融合,是osgi理念能够在实际企业中应用的一个关键。

 osgi bundle与生俱来的SOA的思想,为osgi容器之外的功能提供了服务调用的方式,通过java的反射技术,可以实现对于osgi bundle服务的引用。

  通过以上思想,在调用osgi bundle的应用中,可以实现一个helper class,通过这个class来实现对于Osgi服务的引用。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;


public class ServiceRegistry {

	public static Object invoke(String service,String method,Object[] args)
	{

        ServiceTracker m_tracker = new ServiceTracker((BundleContext) FelixHost.getBundleContext(),service,null);
        m_tracker.open();

        Object[] services = m_tracker.getServices();
        Class[] parametersType = null;

		if(args == null || args.length < 1)
		{
			args = null;
		}
		else
		{
			parametersType = new Class[args.length];
			for(int i=0;i<args.length;i++)
			{
				parametersType[i] = args[i].getClass();
			}
		}
        try {
			Method m = services[0].getClass().getDeclaredMethod(method, parametersType);
			return m.invoke(services[0],args);
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;
	}

}

 其中,利用ServiceTracker获得bundle提供的服务,ServiceTracker.open是对服务进行调用,可能具有多个同名的服务,这里认为他们提供的功能都是相同的,所以就选择第一个服务的结果返回,实际上这里的一个暗含的意思是:一次函数的调用,只能获得一个确定的结果。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值