Разрешение 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 для получения дополнительной информации.