Table Of Contents

Previous topic

7. アプリケーション

Next topic

9. 分散アプリケーション

This Page

8. アプリケーションのインクルード

8.1. 定義

アプリケーションは、他のアプリケーションをインクルードすることができます。インクルードされるアプリケーションは、自分のアプリケーションのディレクトリと、 .app ファイルを持ちますが、他のアプリケーションの監視ツリーの一部として起動されます。

アプリケーションは、他の一つのアプリケーションからしかインクルードできません。

インクルードされたアプリケーションは、他のアプリケーションをインクルードすることができます。

他のアプリケーションからインクルードされていないアプリケーションを、プライマリ・アプリケーションと呼びます。

プライマリアプリケーションとインクルードされたアプリケーション

アプリケーション・コントローラは、プライマリ・アプリケーションをロードする時は、自動的にインクルードされたアプリケーションをロードしますが、起動はしません。インクルードされたアプリケーションのトップのスーパバイザは、インクルードしたアプリケーションのスーパバイザから起動されなければなりません。

これは、起動されるときは、インクルードされたアプリケーションは、プライマリ・アプリケーションの一部となり、インクルードされたアプリケーションのプロセスは、プライマリ・アプリケーションに属しているとみなされます。

8.2. インクルードされるアプリケーションの指定

どのアプリケーションがインクルードされるかは、 .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"}]}
 ]}.

8.3. スタートアップ時のプロセスの同期

インクルードされたアプリケーションの監視ツリーは、インクルードをしたアプリケーショの監視ツリーの一部として起動します。もし、インクルードするアプリケーションと、インクルードされるアプリケーションの間で同期を取る必要があれば、「起動フェイズ」を利用して実現することができます。

起動フェイズは、 .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 には次のような設定を行います。

  • {mod, {Module, StartArgs}} オプションは指定しなければなりません。このオプションはアプリケーションのコールバックモジュールの Module を発見するのに使用されます。 StartArgs は無視され、プライマリ・アプリケーションの Module:start/2 だけが呼ばれます。
  • もし、インクルードされたアプリケーション自身が、他のアプリケーションをインクルードしていた場合には、代わりに {mod, {application_starter, [Module,StartArgs]}} オプションを含めなければなりません。
  • {start_phases, [{Phase,PhaseArgs}]} オプションは設定しなければなりません。また、設定されるフェーズは、プライマリ・アプリケーションで指定したフェーズのサブセットでなければなりません。

もし上記のように 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