0

我从 mavenized 泛光灯创建了一个 OSGi 包。我使用 blueprint config.xml 来激活捆绑包。这是蓝图 config.xml:

<bean id="flbean"
    class="net.floodlightcontroller.core.FloodlightBean"
    init-method="init" destroy-method="destroy">
</bean>

我创建了一个类 FloodlightBean,它提供了 init() 和 stop() 方法来启动和停止包:

public class FloodlightBean {

public void init() throws FloodlightModuleException {
    System.out.println("start floodlight");
    // Setup logger
    System.setProperty("org.restlet.engine.loggerFacadeClass",
            "org.restlet.ext.slf4j.Slf4jLoggerFacade");

    CmdLineSettings settings = new CmdLineSettings();
    /*CmdLineParser parser = new CmdLineParser(settings);
    try {
        parser.parseArgument(args);
    } catch (CmdLineException e) {
        parser.printUsage(System.out);
        System.exit(1);
    }*/

    // Load modules
    FloodlightModuleLoader fml = new FloodlightModuleLoader();
    IFloodlightModuleContext moduleContext = fml
            .loadModulesFromConfig(settings.getModuleFile());
    // Run REST server
    IRestApiService restApi = moduleContext
            .getServiceImpl(IRestApiService.class);
    restApi.run();
    // Run the main floodlight module
    IFloodlightProviderService controller = moduleContext
            .getServiceImpl(IFloodlightProviderService.class);
    // This call blocks, it has to be the last line in the main
    controller.run();
}

public void destroy() {

    System.out.println("stop floodlight");
}

}

对于 init() 方法,我只是将 net.floodlightcontroller.core.Main 中的代码复制到其中。现在可以在 OSGi 容器中启动 Floodlight。但问题是,一旦 Floodlight 捆绑包启动,它就会永远运行。我不知道如何实现 destroy() 来停止泛光灯。

我只是发现泛光灯是多线程的。所以我不能简单地为 net.floodlightcontroller.core.Main 中的代码创建一个线程。我想知道我是否可以为 init() 创建一个进程,并在 destroy() 中实现杀死该进程。谁能帮我这个?

4

1 回答 1

0

如果 IFloodlightModuleLoader 或 Context 没有停止/停用/关闭方法来停止这些线程,那么你就被正式搞砸了。非正式地,您可以在调用 run 之前创建一个 ThreadGroup。如果你很幸运,你可以调用 setDaemon(true),如果它们是唯一使用 VM 的线程,这可能有助于杀死线程。否则,您可以在 ThreadGroup 上调用 stop()。这可能会起作用,但由于不安全而被弃用。

于 2013-03-20T07:58:13.527 回答