EOSアプリケーションフレームワークappbase
4514 ワード
概要
EOSのcleos、nodeos、keosdはプラグインベースのアプリケーションフレームワークappbaseで構築されています.appbaseライブラリは、プラグインのセットからアプリケーションを構築する基本フレームワークを提供しています.appbaseはプラグインのライフサイクルを管理し、すべてのプラグインが正しい順序で構成されていることを確認します.初期化、起動、閉じることができます.appbaseはboost::asioを非同期ライブラリとして使用しています.現在は、appbase::app()でこのインスタンスにアクセスできます.appbaseはプラグイン間の通信インタフェースchannelとmethodを提供し、プラグイン間の通信結合性をより低くする.
例
プラグインベースのアプリケーションの簡単な例はappbase/examplesディレクトリにあります.次に、2つのプラグインの簡単な例を示します.#include
#include
#include
struct database { };
namespace bpo = boost::program_options;
using bpo::options_description;
using bpo::variables_map;
using std::string;
using std::vector;
class chain_plugin : public appbase::plugin
{
public:
APPBASE_PLUGIN_REQUIRES();
//
virtual void set_program_options( options_description& cli, options_description& cfg ) override
{
cfg.add_options()
("readonly", "open the database in read only mode")
("dbsize", bpo::value()->default_value( 8*1024 ), "Minimum size MB of database shared memory file")
;
cli.add_options()
("replay", "clear chain database and replay all blocks" )
("reset", "clear chain database and block log" )
;
}
//
void plugin_initialize( const variables_map& options ) { std::cout << "initialize chain plugin
"; }
//
void plugin_startup() { std::cout << "starting chain plugin
"; }
//
void plugin_shutdown() { std::cout << "shutdown chain plugin
"; }
};
class net_plugin : public appbase::plugin
{
public:
net_plugin(){};
~net_plugin(){};
APPBASE_PLUGIN_REQUIRES( (chain_plugin) );
virtual void set_program_options( options_description& cli, options_description& cfg ) override
{
cfg.add_options()
("listen-endpoint", bpo::value()->default_value( "127.0.0.1:9876" ), "The local IP address and port to listen for incoming connections.")
("remote-endpoint", bpo::value< vector >()->composing(), "The IP address and port of a remote peer to sync with.")
("public-endpoint", bpo::value()->default_value( "0.0.0.0:9876" ), "The public IP address and port that should be advertized to peers.")
;
}
void plugin_initialize( const variables_map& options ) { std::cout << "initialize net plugin
"; }
void plugin_startup() { std::cout << "starting net plugin
"; }
void plugin_shutdown() { std::cout << "shutdown net plugin
"; }
};
//
static appbase::abstract_plugin& _producer_plugin = appbase::app().register_plugin();
//
static appbase::abstract_plugin& _producer_plugin2 = appbase::app().register_plugin();
int main( int argc, char** argv ) {
try {
//
if( !appbase::app().initialize( argc, argv ) )
return -1;
//
appbase::app().startup();
// ,io_service.run()
appbase::app().exec();
} catch ( const boost::exception& e ) {
std::cerr << boost::diagnostic_information(e) << "
";
} catch ( const std::exception& e ) {
std::cerr << e.what() << "
";
} catch ( ... ) {
std::cerr << "unknown exception
";
}
std::cout << "exited cleanly
";
return 0;
}
実行後の結果:~/code/eos/build/libraries/appbase/examples$ ./appbase_example
initialize chain plugin
initialize net plugin
starting chain plugin
starting net plugin
^Cshutdown net plugin
shutdown chain plugin
exited cleanly
main関数でappbaseベースのプログラムを起動するには、3つのステップ:1)appbase::app()が必要です.initialize(argc,argv)、必要なプラグインをロードし、plugin_に注意してください.nameは登録済みである必要があり、プログラムは登録済みの必要なプラグイン2)appbase::app()を選択的にロードすることができる.startup()は、すべてのロードされたプラグイン3を起動する)登録信号(SIGINT,SIGTERM,SIGPIPE),io_service.run()イベントループへ
プラグインベースのアプリケーションの簡単な例はappbase/examplesディレクトリにあります.次に、2つのプラグインの簡単な例を示します.
#include
#include
#include
struct database { };
namespace bpo = boost::program_options;
using bpo::options_description;
using bpo::variables_map;
using std::string;
using std::vector;
class chain_plugin : public appbase::plugin
{
public:
APPBASE_PLUGIN_REQUIRES();
//
virtual void set_program_options( options_description& cli, options_description& cfg ) override
{
cfg.add_options()
("readonly", "open the database in read only mode")
("dbsize", bpo::value()->default_value( 8*1024 ), "Minimum size MB of database shared memory file")
;
cli.add_options()
("replay", "clear chain database and replay all blocks" )
("reset", "clear chain database and block log" )
;
}
//
void plugin_initialize( const variables_map& options ) { std::cout << "initialize chain plugin
"; }
//
void plugin_startup() { std::cout << "starting chain plugin
"; }
//
void plugin_shutdown() { std::cout << "shutdown chain plugin
"; }
};
class net_plugin : public appbase::plugin
{
public:
net_plugin(){};
~net_plugin(){};
APPBASE_PLUGIN_REQUIRES( (chain_plugin) );
virtual void set_program_options( options_description& cli, options_description& cfg ) override
{
cfg.add_options()
("listen-endpoint", bpo::value()->default_value( "127.0.0.1:9876" ), "The local IP address and port to listen for incoming connections.")
("remote-endpoint", bpo::value< vector >()->composing(), "The IP address and port of a remote peer to sync with.")
("public-endpoint", bpo::value()->default_value( "0.0.0.0:9876" ), "The public IP address and port that should be advertized to peers.")
;
}
void plugin_initialize( const variables_map& options ) { std::cout << "initialize net plugin
"; }
void plugin_startup() { std::cout << "starting net plugin
"; }
void plugin_shutdown() { std::cout << "shutdown net plugin
"; }
};
//
static appbase::abstract_plugin& _producer_plugin = appbase::app().register_plugin();
//
static appbase::abstract_plugin& _producer_plugin2 = appbase::app().register_plugin();
int main( int argc, char** argv ) {
try {
//
if( !appbase::app().initialize( argc, argv ) )
return -1;
//
appbase::app().startup();
// ,io_service.run()
appbase::app().exec();
} catch ( const boost::exception& e ) {
std::cerr << boost::diagnostic_information(e) << "
";
} catch ( const std::exception& e ) {
std::cerr << e.what() << "
";
} catch ( ... ) {
std::cerr << "unknown exception
";
}
std::cout << "exited cleanly
";
return 0;
}
実行後の結果:
~/code/eos/build/libraries/appbase/examples$ ./appbase_example
initialize chain plugin
initialize net plugin
starting chain plugin
starting net plugin
^Cshutdown net plugin
shutdown chain plugin
exited cleanly
main関数でappbaseベースのプログラムを起動するには、3つのステップ:1)appbase::app()が必要です.initialize(argc,argv)、必要なプラグインをロードし、plugin_に注意してください.nameは登録済みである必要があり、プログラムは登録済みの必要なプラグイン2)appbase::app()を選択的にロードすることができる.startup()は、すべてのロードされたプラグイン3を起動する)登録信号(SIGINT,SIGTERM,SIGPIPE),io_service.run()イベントループへ