Разрешение gen_fsm на тайм-аут, если он не получает сообщений

Обычно, если бы я хотел получить тайм-аут процесса Erlang, я бы использовал следующую конструкцию:

receive 
    Msg -> ok; %% handle message
after 60000 ->
    %% Handle timeout and exit
end.

Есть ли подобный механизм в OTP-серверах, таких как gen_fsm? Я буду порождать gen_fsm для каждого активного сеанса с моим приложением и хотел бы, чтобы они выходили, если превышено значение тайм-аута для неактивности после получения сообщения.

Я могу написать свой собственный процесс в случае необходимости, но предпочел бы использовать gen_fsm, если это возможно.

1 ответ

Решение

Я выкопал еще немного и нашел ответ на свой вопрос.

Существует необязательный четвертый аргумент в обработчике сообщений "Result", который вы можете использовать, который является тайм-аутом.

так:

some_fsm_state({set, Val}, State) ->
    NewState = do(Val, State),
    {next_state, another_fsm_state, NewState, 5000};

another_fsm_state(timeout, State) ->
    handle_timeout(State).

another_fsm_state({set, Val}, State) ->
    %% more code that handles this state.

Как только вызывается some_fsm_state, он переходит в следующее состояние "another_fsm_state" со временем ожидания 5000 мс. Если в течение 5000 мс получено не новое сообщение, вызывается another_fsm_state (время ожидания, состояние).

Умные OTP-программисты.:)

Следует отметить, что этот четвертый элемент в кортеже Results может находиться в спящем режиме. Пожалуйста, смотрите документацию Erlang для получения дополнительной информации.

Erlang - Hibernate

gen_fsm документы

Другие вопросы по тегам