如何停止运行Floodlight实例?

时间:2013-03-19 23:45:13

标签: java multithreading controls osgi bundle

我已经从mavenized泛光灯创建了一个OSGi包。我使用blueprint config.xml来激活bundle。这是蓝图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容器中启动泛光灯。但问题是,一旦泛光灯束启动,它就会永远运行。我不知道如何实现destroy()来阻止泛光灯。

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

1 个答案:

答案 0 :(得分:0)

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