2012-05-08 25 views
5

Tengo algunas aplicaciones en mi clúster, tengo que iniciar algunas de ellas a veces en diferentes hosts.Erlang, cómo cargar aplicaciones con sus dependencias

La historia es que el clúster de Erlang ya se está ejecutando, así que aunque tengo mi archivo de recursos .app por aplicación que indica qué aplicaciones se deben iniciar antes que las mías, esto solo funciona para crear un script de inicio, no para iniciar una aplicación en un nodo ya en ejecución.

Por el momento tengo una rutina personalizada que utiliza la aplicación: get_key (Aplicación, aplicaciones) para extraer las dependencias e iniciarlas por separado antes de iniciar la aplicación determinada.

Me preguntaba si no hay una mejor manera de hacerlo.

Respuesta

1

Al iniciar la aplicación fuera del script de inicio, primero debe iniciar las dependencias. Puede construir la inteligencia para hacer esto en la propia aplicación, de modo que cuando la aplicación se inicie, se iniciarán las dependencias necesarias antes de que las necesite.

Un lugar en el que he visto esto es en las aplicaciones Mochiweb. El valor por defecto app templates incluyen código para dependencias de carga en el arranque:

-module(some_app). 
-export([start/0, stop/0]). 

ensure_started(App) -> 
    case application:start(App) of 
     ok -> 
      ok; 
     {error, {already_started, App}} -> 
      ok 
    end. 

%% @spec start() -> ok 
%% @doc Start the some_app server. 
start() -> 
    some_app_deps:ensure(), 
    ensure_started(crypto), 
    application:start(some_app). 

%% @spec stop() -> ok 
%% @doc Stop the some_app server. 
stop() -> 
    application:stop(some_app). 
0

Si escribe su aplicación en "Principios de diseño OTP", que tendrá que hacer el archivo yourappname.app, que se contiene `sección de aplicaciones. Esta sección define qué otras aplicaciones desea iniciar antes que la suya. Here se afirma:

aplicaciones

Todas las aplicaciones que deben iniciarse antes de que se inicie esta aplicación . systools usa esta lista para generar secuencias de comandos de inicio correctas. El valor predeterminado es [], pero tenga en cuenta que todas las aplicaciones tienen dependencias al menos kernel y stdlib.

Así que si usa releases, esta resolución de dependencia será resuelta por systools.

+1

Creo que esto solo asegura que su aplicación no se inicie antes de que se inicien todas las dependencias de 'aplicaciones', pero en realidad no las inicia. – nietaki

6

Francamente, las herramientas estándar para hacer esto en Erlang son innecesariamente molestas en este momento. Tiendo a poner lo siguiente caldera de la placa en mi módulo de devolución de llamada de la aplicación:

-module(myapp_app). 
-export([start/0]). 

start() -> a_start(myapp, permanent). 

a_start(App, Type) -> 
    start_ok(App, Type, application:start(App, Type)). 

start_ok(_App, _Type, ok) -> ok; 
start_ok(_App, _Type, {error, {already_started, _App}}) -> ok; 
start_ok(App, Type, {error, {not_started, Dep}}) -> 
    ok = a_start(Dep, Type), 
    a_start(App, Type); 
start_ok(App, _Type, {error, Reason}) -> 
    erlang:error({app_start_failed, App, Reason}). 

A continuación, puede añadir -s myapp_app a la línea de comandos Erlang y esto va a iniciar la aplicación y todas sus dependencias de forma recursiva. ¿Por qué esta función no se encuentra en el módulo de aplicación no sé :)


No es un ejemplo de trabajo de esta custom erlang app startup code en mi Erlang fábrica 2012 de ejemplo SFBay aplicación.

Cuestiones relacionadas