アプリケーションは、他のアプリケーションをインクルードすることができます。インクルードされるアプリケーションは、自分のアプリケーションのディレクトリと、 .app ファイルを持ちますが、他のアプリケーションの監視ツリーの一部として起動されます。
アプリケーションは、他の一つのアプリケーションからしかインクルードできません。
インクルードされたアプリケーションは、他のアプリケーションをインクルードすることができます。
他のアプリケーションからインクルードされていないアプリケーションを、プライマリ・アプリケーションと呼びます。
アプリケーション・コントローラは、プライマリ・アプリケーションをロードする時は、自動的にインクルードされたアプリケーションをロードしますが、起動はしません。インクルードされたアプリケーションのトップのスーパバイザは、インクルードしたアプリケーションのスーパバイザから起動されなければなりません。
これは、起動されるときは、インクルードされたアプリケーションは、プライマリ・アプリケーションの一部となり、インクルードされたアプリケーションのプロセスは、プライマリ・アプリケーションに属しているとみなされます。
どのアプリケーションがインクルードされるかは、 .app ファイルの included_applications キーで指定します。
{application, prim_app,
[{description, "Tree application"},
{vsn, "1"},
{modules, [prim_app_cb, prim_app_sup, prim_app_server]},
{registered, [prim_app_server]},
{included_applications, [incl_app]},
{applications, [kernel, stdlib, sasl]},
{mod, {prim_app_cb,[]}},
{env, [{file, "/usr/local/log"}]}
]}.
インクルードされたアプリケーションの監視ツリーは、インクルードをしたアプリケーショの監視ツリーの一部として起動します。もし、インクルードするアプリケーションと、インクルードされるアプリケーションの間で同期を取る必要があれば、「起動フェイズ」を利用して実現することができます。
起動フェイズは、 .app ファイルの start_phases キーによって定義された、 {Phase, PhaseArgs} というタプルのリストを使って定義します。 Phase にはアトムを、 PhaseArgs には項を指定します。インクルードするアプリケーションの mod キーの、 {application_starter,[Module,StartArgs]} を設定する必要があります。この Module には、通常はアプリケーション・コールバック・モジュールを、 StartArgs にはコールバック関数の Module:start/2 に渡す引数の項を設定します。
{application, prim_app,
[{description, "Tree application"},
{vsn, "1"},
{modules, [prim_app_cb, prim_app_sup, prim_app_server]},
{registered, [prim_app_server]},
{included_applications, [incl_app]},
{start_phases, [{init,[]}, {go,[]}]},
{applications, [kernel, stdlib, sasl]},
{mod, {application_starter,[prim_app_cb,[]]}},
{env, [{file, "/usr/local/log"}]}
]}.
{application, incl_app,
[{description, "Included application"},
{vsn, "1"},
{modules, [incl_app_cb, incl_app_sup, incl_app_server]},
{registered, []},
{start_phases, [{go,[]}]},
{applications, [kernel, stdlib, sasl]},
{mod, {incl_app_cb,[]}}
]}.
インクルードされたアプリケーションを含む、プライマリ・アプリケーションが起動されると、プライマリ・アプリケーションは通常通り起動されます。アプリケーション・コントローラがアプリケーションマスターを作り、アプリケーションマスターが、トップのスーパバイザを起動するために、 Module:start(normal, StartArgs) を呼び出します。
アプリケーションマスターは、プライマリ・アプリケーションで定義されたフェイズごとに、深さ優先探索で、 Module:start_phase(Phase, Type, PhaseArgs) を呼び出します。もし、インクルードされたアプリケーションにフェイズが定義されていない場合には、そのアプリケーションのそのフェイズの関数呼び出しはスキップされます。
インクルードされたアプリケーション向けの .app には次のような設定を行います。
もし上記のように prim_app の起動方法が定義されているのであれば、 application:start(prim_app) が値を返すまでの間に、アプリケーション・コントローラは次のような順番でコールバックを呼び出します。
application:start(prim_app)
=> prim_app_cb:start(normal, [])
=> prim_app_cb:start_phase(init, normal, [])
=> prim_app_cb:start_phase(go, normal, [])
=> incl_app_cb:start_phase(go, normal, [])
ok
Copyright (c) 1991-2009 Ericsson AB