`

内嵌式--代码启动OSGI框架

    博客分类:
  • OSGI
阅读更多

前言

 

前面两篇文章中我们都是直接启动的OSGI框架(equinox),然后把所有bundle放到框架中运行。在平时开发中,由于历史原因,把整个应用都迁移到OSGI框架中 是一件很困难的事,但我们可以尝试把需要热更新的部分剥离出来 制作成bundle。然后在我们现有的web框架中嵌入一个OSGI框架,并使用这个嵌入的OSGI框架加载bundle,从而实现对程序的部分模块化。

 

本次demo是在一个典型的spring mvc框架下的web应用中,通过代码启动一个内嵌OSGI框架。

 

代码启动OSGI框架

 

由于是使用spring,可以直接定义一个spring bean来启动一个OSGI框架:

/**
 * osgi容器管理
 */
@Component
public class OsgiInit {
 
    /**
     * 初始化容器
     */
    @PostConstruct
    public void init() {
        ServiceLoader<FrameworkFactory> serviceLoader = ServiceLoader.load(FrameworkFactory.class);
        FrameworkFactory frameworkFactory = serviceLoader.iterator().next();
 
        //一些启动参数
        Map<String, String> properties = new HashMap<>();
        properties.put("osgi.console", "");
        properties.put("osgi.clean", "true");
        properties.put("org.osgi.framework.bootdelegation", "sun.*,com.sun.*,javax.*");
        properties.put("org.osgi.framework.system.capabilities","osgi.ee; osgi.ee=\"JavaSE\";version:List=\"1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\"");
 
        Framework framework = frameworkFactory.newFramework(properties);
 
        try {
            framework.init();//初始化框架
        } catch (BundleException e) {
            e.printStackTrace();
        }
        try {
            framework.start();//启动框架
 
            Thread thread = new Thread(() -> {
                try {
                    framework.waitForStop(0);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            thread.start();
            Constents.getInstence().setThread(thread);
 
            Constents.getInstence().setFramework(framework);
        } catch (BundleException e) {
            e.printStackTrace();
        }
        System.out.println("osgi容器启动成功");
    }
 
    /**
     * 销毁容器
     */
    @PreDestroy
    public void destroy(){
        System.out.println("开始销毁容器");
        try {
            Constents.getInstence().getFramework().stop();
 
        } catch (BundleException e) {
            e.printStackTrace();
        }
        Constents.getInstence().getThread().interrupt();
    }
}
 

 

这边类是由@Component注释,spring容器会在初始化这个bean之前执行@PostConstruct注释的init方法 启动OSGI框架;spring 容器在销毁之前会执行@PreDestroy注释的destroy方法,销毁OSGI框架。

 

OSGI框架启动成功后,会通过调用Constents.getInstence().setFramework(framework);方法把这个framework对象存起来。看下Constents的实现:

public class Constents {
    private static final Constents constents = new Constents();
    private Thread thread;
    private Framework framework;//OSGI框架对象
    private Map<String,Bundle> bundleMap = new HashMap<>();//OSGI框架中加载的Bundle
 
    private Constents(){}
    public static Constents getInstence(){
        return constents;
    }
 
    public Thread getThread() {
        return thread;
    }
 
    public void setThread(Thread thread) {
        this.thread = thread;
    }
 
    public Framework getFramework() {
        return framework;
    }
 
    public void setFramework(Framework framework) {
        this.framework = framework;
    }
 
    public void setBundle(Bundle bundle){
        this.bundleMap.put(bundle.getSymbolicName(),bundle);
    }
 
    public Bundle getBundle(String name){
        return this.bundleMap.get(name);
    }
}
 

 

Constents使用了单例模式生成一个唯一的Constents对象,上述代码在OSGI容器启动成功后,会把framework对象赋值给Constents对象。在web框架中可以直接调用这个对象的相关方法动态的加载Bundle

 

这里我们在一个Spring mvc Controller中,模拟对Bundle的加载和启动:

@RequestMapping("/start")
    public String start(){
        Framework framework = Constents.getInstence().getFramework();//
        try {
            File bundleRoot = new File("D:\\test\\bundles");
            File[] files = bundleRoot.listFiles();
            for (File jar :files){
                Bundle temp = framework.getBundleContext().installBundle(jar.toURL().toExternalForm());
                Constents.getInstence().setBundle(temp);
            }
            //启动manager bundle
            Constents.getInstence().getBundle("com.sky.osgi.manager").start();
 
        } catch (Exception e) {
            System.out.println("安装bundle失败");
            e.printStackTrace();
        }
        return "start";
}

当然也可以在Controller中定义其他修改bundle、删除bundle等方法,以控制内嵌的OSGI容器的内部bundle运行。

 

 

0
1
分享到:
评论

相关推荐

    httpcomponents-client-4.1.2-osgi-bin.tar.gz

    这个“httpcomponents-client-4.1.2-osgi-bin.tar.gz”文件是HttpClient的一个特定版本——4.1.2,打包成OSGi格式的二进制版本。本文将深入探讨这个版本的特性、使用场景以及如何在OSGi环境中部署和使用。 首先,...

    osgi-resource-locator-1.0.1-API文档-中文版.zip

    赠送源代码:osgi-resource-locator-1.0.1-sources.jar; 赠送Maven依赖信息文件:osgi-resource-locator-1.0.1.pom; 包含翻译后的API文档:osgi-resource-locator-1.0.1-javadoc-API文档-中文(简体)版.zip; Maven...

    killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip

    【标题】"killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip" 是一个基于OSGi的 Kill Bill 库,其中包含了SLF4J(Simple Logging Facade for Java)的OSGi兼容版本。SLF4J是一个为各种日志框架提供简单抽象的接口,...

    spring-boot-with-embeded-osgi:带有嵌入式OSGI框架的Spring Boot项目

    带有嵌入式OSGI的Spring Boot 这是一个嵌入了Felix OSGI框架的示例Spring Boot项目。 其他项目是API(接口和模型类)及其实现。 Spring Boot应用程序将这些程序包作为OSGI框架的额外程序包公开(以便能够使用公开的...

    com.springsource.org.apache.commons.dbcp-sources-1.2.2.osgi.jar

    com.springsource.org.apache.commons.dbcp-sources-1.2.2.osgi.jar源码 jar包

    httpcomponents-client-4.1.2-osgi-bin.zip

    这个“httpcomponents-client-4.1.2-osgi-bin.zip”压缩包包含了HttpClient的OSGi(Open Service Gateway Initiative)版本,它是一个用于构建模块化Java应用程序的标准框架。在本文中,我们将深入探讨HttpClient ...

    httpcomponents-client-4.5.5-osgi-bin

    6. **OSGi 兼容**:"osgi-bin" 表明此版本已优化为 OSGi(Open Service Gateway Initiative)兼容,方便在 OSGi 框架下使用,如 Eclipse Equinox 或 Apache Felix。 7. **可扩展性**:HttpClient 设计为模块化,...

    acegi-security-1.0.7-osgi.jar.zip

    总结来说,Acegi Security 1.0.7-osgi.jar.zip是一个适用于OSGi环境的旧版安全框架,提供了全面的认证和授权机制。尽管Acegi Security已被Spring Security取代,但了解其工作原理和用法仍然对理解现代Web应用的安全...

    httpcomponents-client-4.5.4-osgi-bin.zip

    httpcomponents-client-4.5.4-osgi-bin.zip 内含: org.apache.httpcomponents.httpclient_4.5.4.jar 官方说明: The Apache HttpComponents™ project is responsible for creating and maintaining a toolset of...

    httpcomponents-client-4.5.4-osgi-bin.tar.gz

    httpcomponents-client-4.5.4-osgi-bin.tar.gz 内含: org.apache.httpcomponents.httpclient_4.5.4.jar 官方说明: The Apache HttpComponents™ project is responsible for creating and maintaining a toolset ...

    spring-osgi-1.2.1-with-dependencies.zip

    spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip spring-osgi-1.2.1-with-dependencies.zip

    spring-osgi-1.2.1-with-dependencies

    本文将围绕“spring-osgi-1.2.1-with-dependencies”这一完整包展开,详细解析其包含的知识点和应用场景。 OSGi是Java平台上的一种模块化系统,它允许开发者将大型应用程序分解为独立的、可交互的组件,这些组件...

    基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip

    基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip 基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip 基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip 基于java的开发源码-OSGi 分布式通讯组件 R-OSGi.zip ...

    spring osgi 入门

    ### Spring OSGi 入门知识点详解 #### 一、Spring-DM与OSGi结合的优势 Spring Dynamic Modules (Spring DM) 是Spring Framework的一个扩展项目,它使得Spring可以在OSGi环境中运行,进而为开发者提供了模块化的...

    httpcomponents-client-4.2-alpha1-osgi-bin.zip

    标题中的"httpcomponents-client-4.2-alpha1-osgi-bin.zip"是一个开源软件包,它包含了Apache HTTP客户端组件的4.2 Alpha1版本,专为OSGi(Open Service Gateway Initiative)框架设计。OSGi是一种Java模块化系统,...

    Felix_OSGi实作

    OSGi规范使得Java程序可以被设计成一套小型的、独立的模块(称为Bundle),这些模块可以在运行时动态地加载、卸载、启动或停止。 Felix是一个遵循OSGi规范的轻量级、模块化的Service Oriented Runtime,由Apache...

    Eclipse 的启动参数

    Eclipse Equinox OSGi 平台的启动方式有两种:直接通过 startup.jar 启动和通过 Equinox 提供的可执行的加载器(Launcher)启动。两种方式都是通过读取 config.ini 文件初始化系统,只是配置方式有所不同。 通过 ...

    easybeans-osgi-itests-applications-osgi-1.2.4-sources.jar

    jar包,官方版本,自测可用

    easybeans-osgi-itests-applications-osgi-1.2.3-sources.jar

    jar包,官方版本,自测可用

Global site tag (gtag.js) - Google Analytics