code

2017年3月13日 星期一

Erlang筆記14 - OTP 2: gen_server

使用OTP的gen_server步驟

(1) 決定你的callback module名稱
例如我們叫他my_bank

(2) 決定你的callback module的給client介面 
例如這個銀行的module可能有以下幾個functions:



這些interface會利用OTP gen_server裡面的function來implement:


可以看到start() function使用到了gen_server:start_link(),這是gen_server開啟一個server的方法,這邊開啟了一個local server,如果傳入global atom的話,就變成某個cluster都可以access的global server。

?MODULE是一個macro,會把目前的module name替換出來。

而gen_server:call()就是我們之前implement的rpc這種remote procedure call。


(3) implement callbacks
這邊就一定要符合OTP gen_server需要的 callback介面,否則應該會有runtime exception,包括以下六個 :

init/1 
handle_call/3
handle_cast/2 
handle_info/2 
terminate/2
code_change/3

記得要 export出去這六個 callback functions,否則gen_server module會無法呼叫它們。

某些editor(例如emacs)可能會提供skeleton template,例如這樣:


這邊有一個新的東西 -behavior(),意思是要跟compiler講幫我們檢查是否implement了所有gen_server要得callbacks,相當於java "implements" keyword。

這些callback中,最重要的是handle_call,而第一個參數實際上又有三種patterns:



以下是這個my_bank,erl的所有gen_server callback:


























沒有留言:

張貼留言