2017-01-13 11 views
0

Теперь Im играя с gen_servergen_server: вызов - как отправить сообщение

У меня есть два модуля - один Gen сервер моды, второй - логический модуль

и хотел бы отправить сообщение PID через gen_server: вызов

вот надрез кода:

lookup_by_date(FromTime, ToTime) -> 
    gen_server:call({global, ?MODULE}, {lookup_by_date,FromTime,ToTime}). 

вот handle_call FUNC:

handle_call({lookup_by_date, FromTime, ToTime}, _From, _State) -> 
    FromSec = calendar:datetime_to_gregorian_seconds(FromTime), 
    ToSec = calendar:datetime_to_gregorian_seconds(ToTime), 
    Pid = spawn(fun()-> logic:handler() end), 
    {reply, Pid !{lookup_by_date, FromSec, ToSec}, _State}; 

а и логика мод код:

lookup_by_date(FromTime, ToTime) -> lookup_by_date(FromTime, ToTime, ets:first(auth), []). 
lookup_by_date(_FromTime, _ToTime, '$end_of_table', Acc) -> {reply, Acc, ok}; 
lookup_by_date(FromTime, ToTime, Key, Acc) -> 
    case ets:lookup(auth, Key) of 
     [{Login, Pass, TTL, Unix, Unix2}] -> 
      F = calendar:datetime_to_gregorian_seconds(Unix2), 
     T = calendar:datetime_to_gregorian_seconds(Unix2), 
     if 
      F >= FromTime, T =< ToTime -> NewAcc = [{Login, Pass, TTL, Unix, Unix2}|Acc], 
     N = ets:next(auth, Key), 
      lookup_by_date(FromTime, ToTime, N, NewAcc); 
     true -> N = ets:next(auth, Key), 
        lookup_by_date(FromTime, ToTime, N, Acc) 
     end 
     end. 

handler() -> 
    receive 
     {lookup_by_date, FromTime, ToTime}-> 
      lookup_by_date(FromTime, ToTime), 
      handler(); 
     Other-> 
     io:format("Error message for ~p~n" ,[Other]), 
     handler() 
    end. 

, но я получаю сообщение об ошибке (на самом деле не ошибка)

2> с (cache_server).

{ок, cache_server}

3> с (логика).

{ОК, логика}

4> cache_server: начало ([{ТТЛ, 15000}]).

{ок, < 0.73.0>}

5> cache_server: вставка (тест, корень, 15000).

{аутентификации, тест, корень, 15000,1484309726435, {{2017,1,13}, {14,15,11}}}

6> cache_server: lookup_by_date ({{2017,1, 13}, {14,15,11}}, {{2017,1,13}, {14,15,11}}).

{lookup_by_date, 63651536111,63651536111}


Я получаю данные из - {ответа, Pid {lookup_by_date, FromSec, ToSec}, _State!};

но не получает данные от «логики: lookup_by_date» функций

Есть в любом случае вы показать мне правильное направление, потому что я застрял немного. Thx ...

ответ

2

В своем коде, ответ на вызов gen_server является:

Pid !{lookup_by_date, FromSec, ToSec} 

В сообщениях Erlang являются асинхронными, они просто послали к процессу, так что этот код не ждет ответ, и он просто сразу возвращает сообщение, которое вы отправляете. Именно поэтому вы получаете ответ {lookup_by_date, FromSec, ToSec}.

В вашем случае вы не должны порождать процесс, а просто вызовите функцию lookup_by_date:

handle_call({lookup_by_date, FromTime, ToTime}, _From, _State) -> 
    FromSec = calendar:datetime_to_gregorian_seconds(FromTime), 
    ToSec = calendar:datetime_to_gregorian_seconds(ToTime), 
    {reply, logic:lookup_by_date(FromSec, ToSec), _State}; 

Примечание: Ваш gen_server не использует результат, его состояние не изменяется по требованию , поэтому вы можете напрямую вызвать функцию lookup_by_date и включить в нее преобразование времени.

+0

ahh. спасибо за Ваш ответ. и теперь он отлично работает. Очень полезно. THX снова – Qbeck