2010-02-24 9 views
5

Normalerweise, wenn Ich mag würde einen Erlang Prozess Timeout habe ich das folgende Konstrukt verwenden würde:erlaubt ein gen_fsm Timeout, wenn es keine Nachrichten empfängt

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

Gibt es einen ähnlichen Mechanismus in den OTP-Server wie gen_fsm? Ich werde gen_fsm für jede aktive Sitzung mit meiner Anwendung generieren und möchte sie beenden lassen, wenn ein Timeout-Wert für Inaktivität nach Erhalt einer Nachricht überschritten wird.

Ich kann meinen eigenen benutzerdefinierten Prozess schreiben, wenn es sein muss, würde aber lieber ein gen_fsm verwenden, wenn möglich.

Antwort

11

Ich grub etwas mehr und fand die Antwort auf meine eigene Frage.

Es gibt ein optionales viertes Argument im Nachrichtenhandler "Result" s, das Sie verwenden können, was ein Timeout ist.

so:

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. 

Sobald some_fsm_state aufgerufen wird, geht es in den nächsten Zustand von "another_fsm_state" mit einem Timeout von 5000ms. Wenn innerhalb von 5000 ms keine neue Nachricht empfangen wird, wird ein anderer_fm_status (Zeitüberschreitung, Status) aufgerufen.

Clevere OTP-Programmierer. :)

Es sollte beachtet werden, dass dieses vierte Element in der Ergebnis Tupel Winterschlaf gehalten werden kann. Weitere Informationen finden Sie in der Erlang-Dokumentation.

Erlang - Hibernate

gen_fsm docs

+3

Auch können Sie die anfängliche Timeout, wenn Sie eine '{Timeout-Zeit}' Option beim Aufruf von Anfang übergeben. – Zed

+0

Ausgezeichnet, danke Zed! –

Verwandte Themen