Permitindo que um gen_fsm tem tempo limite se não receber mensagens
Pergunta
Normalmente, se eu gostaria de ter um tempo limite do processo Erlang, eu usaria o seguinte construto:
receive
Msg -> ok; %% handle message
after 60000 ->
%% Handle timeout and exit
end.
Existe um mecanismo semelhante nos servidores OTP, como o Gen_FSM? Estarei gerando GEN_FSM para cada sessão ativa com meu aplicativo e gostaria de sair se um valor de tempo limite para inatividade for excedido após o recebimento de uma mensagem.
Posso escrever meu próprio processo personalizado, se necessário, mas preferiria usar um Gen_FSM, se possível.
Solução
Eu cavei um pouco mais e encontrei a resposta para minha própria pergunta.
Há um quarto argumento opcional no manipulador de mensagens "resultados" que você pode usar, que é um tempo limite.
assim:
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.
Depois que o Some_fsm_state é chamado, ele transita para o próximo estado de "outro_fsm_state" com um tempo limite de 5000ms. Se não for uma nova mensagem é recebida dentro de 5000ms, outro_fsm_state (tempo limite, estado) é chamado.
Programadores OTP inteligentes. :)
Deve -se notar que esse quarto elemento nos resultados Tuple pode ser hibernado. Consulte a documentação do Erlang para obter mais informações.