初探Java企业级开源框架OSGi

发表于:2011-5-16 09:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:付江    来源:CSDN

分享:

  这里需要覆写在BobSays Bundle 中的Activator 的两个方法,具体代码如下:

public class Activator implements BundleActivator {

    private ServiceRegistration serviceReg = null;


    public void start(BundleContext context) throws Exception {
        serviceReg = context.registerService(SayHello.class.getName(),
                new BobSays(), null);// 1
    }

    public void stop(BundleContext context) throws Exception {
        if (serviceReg != null)
            serviceReg.unregister();// 2
    }
}

  完成的主要功能是:1、在启动服务的时候,注册BoySays 服务为一个SayHello 服务;2、在停止服务的时候,从上下文中卸载该服务。

  类似的创建KentSays、RodSays 两个project。

  最后,创建一个名为SayHelloService 的plug-in project。笔者设置的包为org.osgi.demo.service,同样在配置dependencies 的时候,将包org.osgi.demo.say 引入。创建SayHelloService类,代码如下:

public class SayHelloService {

    private SayHello say;

    public void helloWorld() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.err.println("Thread can't sleep");
            }
            say.sayHello();
        }
    }

    public void setSay(SayHello say) {
        this.say = say;
    }
}

  这里采用依赖注入的方式,所以有一个setSay() 方法,来设置一个具体的SayHello。helloWorld() 方法就是调用特定的SayHello.sayHello() 来完成的,用10秒钟的时间打印十次sayHello() 的具体内容。该Bundle 的Activator 代码如下:

public class Activator implements BundleActivator {

    private ServiceRegistration serviceReg = null;

    public void start(BundleContext context) throws Exception {
        SayHelloService sayService = new SayHelloService();
        serviceReg = context.registerService(SayHelloService.class.getName(),
                sayService, null);// 1
        ServiceReference serviceRef = context
                .getServiceReference(SayHello.class.getName());// 2
        sayService.setSay((SayHello) context.getService(serviceRef));// 2
        sayService.helloWorld();// 3
    }


    public void stop(BundleContext context) throws Exception {
        if (serviceReg != null)
            serviceReg.unregister();
    }
}

  完成的主要功能是:1、注册SayHelloService 服务;2、获取一个的SayHello 服务;3、并注入到SayHelloService 服务中,现在注入的服务是从服务上下文中具体获取的,而到底是哪个,只有在运行时状态才能决定。

  至此,所有的Bundles 我们都已经完成了,选择Open Run Dialog...,并选中上述五个Bundles 和OSGi 核心Bundle,点击Run 按钮。输入“ss”,列出了6个Bundles 的状态,此时,如果你的SayHelloService Bundle 状态是Resolved,那么你可以通过命令“start ‘SayHelloService Bundle 状态的id’”,启动SayHelloService,此时你会看到打印出的10条hello world信息。读者可以手动利用用命令“start” 和“stop” 改变sayHello 的具体执行者,动态的更换实际sayHello 的执行者。这个简单的HelloWorld 应用,可以说明SayHelloService 在具体执行的过程中行为是可动态改变的,并且改变只是局部的。

  小结

  读完本文,实际动手做过HelloWorld,想必读者对OSGi 框架也应该有所了解了,OSGi 框架在国外关注率是挺高的,但是在国内的推广和使用却不够广泛,可能是因为OSGi 字面上的意思太过于抽象,因此笔者在这里将这个优秀的框架介绍给大家,本片只是一个简单的介绍,并不涉及OSGi 框架深入的知识。

44/4<1234
2023测试行业从业人员调查问卷已开启,千元大奖正在等你~

精彩评论

  • wmzsoft
    2015-6-02 10:15:35

    httop://osgi.jxtech.net 就是一个基于OSGi的企业级开发平台,从在线演示和免费插件来看,做得十分优秀。

  • wmzsoft
    2015-5-26 15:56:42

    http://osgi.jxtech.net 就是一个成功的OSGi企业级开发平台。

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号