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() でそのプロセスの強制終了を実装できるかどうか疑問に思っています。誰でもこれで私を助けることができますか?