0

Mavenized Floodlight から OSGi バンドルを作成しました。blueprint config.xml を使用してバンドルをアクティブにします。ブループリントの config.xml は次のとおりです。

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

バンドルを開始および停止するための init() および stop() メソッドを提供するクラス FloodlightBean を作成します。

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 バンドルを開始すると、永久に実行されることです。Floodlight を停止するために destroy() を実装する方法がわかりません。

Floodlight がマルチスレッドであることを知りました。したがって、単純に net.floodlightcontroller.core.Main 内のコードのスレッドを作成することはできません。init() のプロセスを作成し、destroy() でそのプロセスの強制終了を実装できるかどうか疑問に思っています。誰でもこれで私を助けることができますか?

4

1 に答える 1

0

IFloodlightModuleLoader または Context に、これらのスレッドを停止する stop/deactivate/close メソッドがない場合は、正式に台無しになります。非公式には、run を呼び出す前に ThreadGroup を作成できます。運が良ければ、setDaemon(true) を呼び出すことができます。これは、VM を使用している唯一のスレッドである場合にスレッドを強制終了するのに役立つ場合があります。それ以外の場合は、ThreadGroup で stop() を呼び出すことができます。これはうまくいく可能性がありますが、安全ではないため非推奨です。

于 2013-03-20T07:58:13.527 に答える