首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确启动和关闭OSGi容器?

如何正确启动和关闭OSGi容器?
EN

Stack Overflow用户
提问于 2015-01-19 23:55:22
回答 1查看 1.4K关注 0票数 1

我制作了一个包,它有一个Activator文件,它基本上按照其他包的正确顺序启动它们。我需要这样做,因为框架会在一些包的依赖项完成启动之前启动它们。例如,取决于我的日志服务,我的捆绑包将在它之前启动,因此日志消息不会为这些包存储。有了这个激活器,我可以选择谁先启动,因为在felix中没有明确的方法。

这方面的代码如下:

代码语言:javascript
复制
package lumina.launcher;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;

public final class Launcher implements BundleActivator {

    private BundleContext context;

    private final String relativePath = "./bundle/";

    private final void print(String msg) {
        // System.out.println(msg);
    }

    private Bundle install(String path) throws BundleException {
        Bundle bundle = this.context.installBundle("file:/" + path);
        print("\tInstalling: " + bundle.getSymbolicName());
        return bundle;
    }

    private boolean isJar(String fileName) {
        final String[] tokens = fileName.split("\\.");
        return tokens.length != 0 && "jar".equals(tokens[tokens.length - 1]);
    }

    private String[] listFilesForFolder(final File folder)
            throws BundleException {
        final List<String> bundles = new ArrayList<String>();
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {
                if (isJar(fileEntry.getName())) {
                    bundles.add(fileEntry.getAbsolutePath().replace(
                            File.separatorChar, '/'));
                }
            }
        }
        return bundles.toArray(new String[0]);
    }

    @Override
    public void start(BundleContext context) throws Exception {
        this.context = context;
        installStart("third-party");
        installStart("shared-components");
        installStart("lumina");
        installStart("webconsole");
        System.out
                .println("-> You can access Felix WebConsole at http://localhost:8080/system/console");
        Thread.sleep(2000);
        installStart("plugins");
    }

    private final void installStart(String path) throws BundleException {
        print("Installing " + path);
        final String[] targetBundles = listFilesForFolder(new File(relativePath
                + path));
        final Bundle[] bundles = new Bundle[targetBundles.length];
        for (int i = 0; i < targetBundles.length; i++) {
            bundles[i] = install(targetBundles[i]);
        }
        print("\tStarting installed bundles...");
        for (Bundle b : bundles)
            b.start();
    }

    @Override
    public void stop(BundleContext arg0) throws Exception {
    }

}

这就是我如何在felix的bundle/文件夹中组织我的包。

代码语言:javascript
复制
C:\felix\BUNDLE
│   .gitignore
│   lumina.launcher-1.0.0-SNAPSHOT.jar
│
├───lumina
│       .gitignore
│       lumina.api-0.0.4-SNAPSHOT.jar
│
├───plugins
│       .gitignore
│       lumina.assembler-0.0.1-SNAPSHOT.jar
│       lumina.extensions.drivers.ip-0.0.1-SNAPSHOT.jar
│       lumina.rest-0.0.4-SNAPSHOT.jar
│       shared.extensions.base.logger-1.0.2-SNAPSHOT.jar
│       smartcampuskndriver.gateway-0.0.1-SNAPSHOT.jar
│       smartcampusmetersip.gateway-0.0.1-SNAPSHOT.jar
│
├───shared-components
│       codebase-2.0.0.jar
│       shared.osgi.services-1.3.0-SNAPSHOT.jar
│       shared.osgi.services.logger-1.0.0-SNAPSHOT.jar
│       shared.properties.api-5.2.1-SNAPSHOT.jar
│
├───third-party
│       com.googlecode.json-simple_1.1.0.jar
│       org.apache.felix.bundlerepository-2.0.2.jar
│       org.apache.servicemix.bundles.joda-time-2.3_1.jar
│       org.apache.servicemix.bundles.junit-4.11_1.jar
│       org.osgi.compendium-1.4.0.jar
│       org.osgi.core-1.4.0.jar
│       org.restlet.ext.json_2.1.0.M1.jar
│       org.restlet.jse.org.restlet.lib.org.json_2.0.0.jar
│       org.restlet_2.1.0.M1.jar
│       OSGiJMX.jar
│
├───unused
│       org.apache.felix.gogo.command-0.14.0.jar
│       org.apache.felix.gogo.runtime-0.12.1.jar
│       org.apache.felix.gogo.shell-0.10.0.jar
│
└───webconsole
        org.apache.felix.http.api-2.3.2.jar
        org.apache.felix.http.jetty-2.3.2.jar
        org.apache.felix.http.servlet-api-1.0.1.jar
        org.apache.felix.webconsole-4.2.4-all.jar

请注意,lumina.launcher-1.0.0-SNAPSHOT.jar是我的Activator所在的地方,也是唯一由felix自动启动的包。

顺便说一句,这个方法很好,不知道是否有更聪明的方法。因此,上述代码的思想是按照以下顺序从每个目录启动所有包:第三方、共享组件、lumina、web控制台和插件。

另一方面,在运行OSGi容器时,当我在终端中命中^C时,它开始一个接一个地停止所有包。这是可以的,但是日志服务是首批停止的包之一,我希望它是最后一个包之一。是否有一种方法来设置在OSGi容器关闭时停止包的顺序?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-01-20 15:38:16

我需要这样做,因为框架会在一些包的依赖项完成启动之前启动它们。

OSGi的规则之一是,所有的包都应该以开始顺序不重要的方式实现。

如果您真的需要开始订单,您应该为您的包设置开始级别。请参阅OSGi核心规范的第10.5章,以获得有关启动级别的更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28035598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档