Erlang gen_server возвращает неверное возвращаемое значение

Я пытаюсь отправить сообщение на gen_server:

 gen_server:cast({global, ID}, {watchers}).

Обработчик:

handle_cast({watchers}, State) ->
    case State#table_state.watchers of
    [] ->
        {reply, no_watchers, State};
    _ ->
        {reply, State#table_state.watchers, State}
    end;

Но когда я выполняю gen_server:cast, gen_server завершается с ошибкой:

=ERROR REPORT==== 29-Apr-2011::18:26:07 ===
** Generic server 1 terminating 
** Last message in was {'$gen_cast',{watchers}}
** When Server state == {table_state,1,"1",11,[]}
** Reason for termination == 
** {bad_return_value,{reply, no_watchers, {table_state,3,"3",11,[]}}}

Почему я получаю bad_return_value?


person 0xAX    schedule 29.04.2011    source источник
comment
В качестве примечания: вам не нужно отправлять {watchers} (атом внутри кортежа), достаточно отправить только атом watchers в качестве сообщения.   -  person Adam Lindberg    schedule 29.04.2011


Ответы (1)


Вы не можете ответить с помощью приведения (см. gen_server документацию). В этом весь смысл приведения асинхронного сообщения вместо вызова.

В вашем случае вы хотите вернуть ответ, поэтому вместо этого используйте gen_server:call/2.

person Adam Lindberg    schedule 29.04.2011
comment
Итак, handle_cast должен вернуть {noreply,State}. Используйте gen_server:call и handle_call для синхронного вызова, который возвращает значение. - person rvirding; 29.04.2011