LINUX.ORG.RU

С такой постановкой остается только продолжать читать доки.

На вот otp на пальцах, в следующих главах будет настоящий otp.

staseg ★★★★★
()

сделай supervisor, который запускает твой gen_server. в application:start(normal, _) запускай supervisor.

anonymous
()

назовем приложение job. делаешь модуль, объявляешь behaviour application и реализуешь два колбека - start(), stop(). Аппликейшн в парадигме ОТП должен стартовать корневой супервизор (см тело функции start)

-module(job_app).

-behaviour(application).

%% Application callbacks
-export([start/2, stop/1]).

start(_StartType, _StartArgs) ->
    job_sup:start_link().

stop(_State) ->
    ok.

далее, создаешь модуль супервизова и объявляешь behaviour supervisor. соответственно, у него свои колбеки. для удобства я использую макрос CHILD.

-module(job_sup).

-behaviour(supervisor).

%% API
-export([start_link/0]).

%% Supervisor callbacks
-export([init/1]).

%% Helper macro for declaring children of supervisor
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}).


start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

%% Supervisor callbacks
init([]) ->
    {ok, { {one_for_one, 5, 10}, [
        ?CHILD(job, worker)
    ]} }.

ну, а дальше реализуешь непосредственно модуль воркера в виде генсервера.

-module(job).
-behaviour(gen_server).

-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,code_change/3]).

-record(state, {}).

start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

init(_Args) ->
    {ok, #state{}}.

handle_call(_Request, _From, State) ->
    {reply, ok, State}.

handle_cast(_Msg, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.

в тела колбеков пиши свою логику, сохраняй в стейт. ваяй функционал. вуа-ля, ты запилил свое приложение в парадигме ОТП :)

Deleted
()
Ответ на: комментарий от Deleted

Круто, спасибо. Но теперь появились вопросы.

1. Как вообще связан application и supervisor? Я правилно понимаю, что супервизор создаётся под покровительством аппликейшна? Может ли быть в одном аппликейшне несколько, например, супервизоров?

2. У меня простенькое приложение. Нужен ли мне вообще этот генсервер? Куда там писать свой код и зачем в нём столько калбэков?

NightmareZombie
() автор топика

Возьми за основу какое нибудь популярное приложение.

Смотри документацию, исходники - исчерпывающе.

Настрой emacs для работы.

anonymous
()
Ответ на: комментарий от NightmareZombie

Думаю, тебе лучше почитать книжку :). Перепечатывать её в комментариях дело не благодарное

Deleted
()
Ответ на: комментарий от NightmareZombie

1. из application_module:start/2 нужно возвращать {ok, Pid}, где Pid принадлежит корневому супервизору приложения. Под ним могут жить любые процессы, в т.ч. и другие супервизоры. 2. google: erlang library application если у тебя не предполагается процессов.

nwalker
()
Ответ на: комментарий от NightmareZombie

Создать аппликейшн:

./rebar create-app appid=myapp
loz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.