際際滷

際際滷Share a Scribd company logo
Behaviours	
 and	
 Applica2ons

gen_server,	
 supervisor	
 and	
 applica2on
What	
 You	
 Will	
 油京顎庄鉛糸
The	
 Protocol

Module:Func+on(Arg1,	
 ...,	
 ArgN).




<func+on	
 return	
 as	
 text>
In	
 Broad	
 Strokes




Step	
 1:	
 tr_server      Step	
 2:	
 OTP	
 packaged




                                                             4
How	
 the	
 Fundamental	
 Pieces	
 Fit


Modules                                       Send
                                 Processes                   Messages
          Contain          Run

                    Func+ons             Are	
 sent	
 to
Behaviour	
 Basics

 Behaviour	
 Interface
 Behaviour	
 Implementa2on
 Behaviour	
 Container




                               6
Take	
 a	
 Look


    ex1.erl	
 -足>	
 ex2.erl	
 -足>	
 ex2behaviour.erl
Example	
 Behaviour
 Behaviour	
 Interface
   init/0
   handle_msg/2
 Behaviour	
 Implementa3on
   ex2	
 module
 Behaviour	
 Container
   ex2behaviour	
 module
   1	
 to	
 1	
 process	
 model
   contained	
 in	
 the	
 ex2behaviour	
 module



                                                       8
gen_server	
 Interface
        init/1


                           ronous
                                  handle_call/3


asyncronous
      handle_call/3

                            handle_info/2
                            lets	
 talk	
 later...
                                                    9
gen_server	
 Container
gen_server:start_link/4	
 
                              init/1

gen_server:call/2	
 
                              handle_call/3

gen_server:cast/2	
 

                              handle_cast/2



                                              10
Whats	
 Calls	
 What,	
 Where?
          ?MODULE:store()	
 -足>	
 gen_server:call/2




Client	
 process

                                                            Dispatch
                                                             to	
 impl
                                                         ?MODULE:handle_call/3
                                           gen_server
                                            container
                                                                           11
Documenta2on	
 -足	
 EDoc

  %%%	
 File	
 Scope
  @author
  @copyright

  %%	
 Func+on	
 Scope
  @doc
  @spec	
 |	
 -足spec
  @end




                              12
Laying-足Out	
 a	
 Module

         {
               %%%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%	
 @author	
 Mar,n	
 Logan	
 <mar,njlogan@Macintosh.local>	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%	
 @copyright	
 (C)	
 2010,	
 Mar,n	
 Logan	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
Header         %%%	
 @doc	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%	
 @end	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%	
 Created	
 :	
 15	
 Sep	
 2010	
 by	
 Mar,n	
 Logan	
 <mar,njlogan@Macintosh.local>	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               -足module(ex4).

               %%	
 API	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               -足export([]).




         {
               %%%===================================================================	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%	
 API	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%===================================================================	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
 API           %%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%	
 @doc	
 	
 my	
 func,on.	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%	
 @end	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               -足spec	
 my_func(term)	
 -足>	
 ok.




           {
               %%%===================================================================	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 

Internal       %%%	
 Internal	
 func,ons	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 
               %%%===================================================================




                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         13
TCP	
 Basics	
 
Server
1.	
 Bind
2.	
 Listen}     gen_tcp:listen/2


3.	
 Accept      gen_tcp:accept/1
4.	
 Send/Recv   gen_tcp:send/1
                  handle_info/2
Client
1.	
 Connect     gen_tcp:connect/2

2.	
 Send/Recv   gen_tcp:send/1
                  handle_info/2

                                      14
Our	
 TCP	
 Handling	
 gen_server


                 tcp_rpc/src/tr_server.erl
Tes2ng	
 the	
 Server

$ erl pa tcp_rpc/ebin
 Eshell V5.5.5 (abort with ^G)
 1> {ok, LSock} = gen_tcp:listen(8080, [{active, true}, {reuseaddr, true}]).
 
 2> tr_server:start_link(LSock).
 


From	
 your	
 standard	
 command	
 line	
 (bash,	
 sh,	
 etc...):

$? telnet localhost 8080
> io_lib:format(~p ~p~n, [hello, tr_server]).
Applica2ons



Ac+ve                 Library
Applica2on	
 Layout
The	
 Directory	
 Layout	
 


<application-name>[-<version>]
                           |
                           |- doc
                           |- ebin
                           |- include
                           |- priv
                           |- src
Applica2on	
 Metadata

%% -*- mode: Erlang; fill-column: 75; comment-column: 50; -*-

{application, tcp_rpc,
 [{description, "RPC server for Erlang and OTP in action"},
  {vsn, "0.1.0"},
  {modules, [tr_app,
             tr_sup,
             tr_server]},
  {registered, [tr_sup]},
  {applications, [kernel, stdlib]},
  {mod, {tr_app, []}}
 ]}.
Applica2on	
 Behavior


          tcp_rpc/src/tr_app.erl
Applica2on	
 is	
 also	
 a	
 Behaviour

    Interface	
 start/2,	
 stop/1
    Implementa2on	
 tr_app.erl
    Container	
 applica2on.erl
    Container	
 has	
 a	
 one	
 to	
 many	
 process	
 
     architecture.




                                                                 22
Supervisors
Supervisors	
 Hierarchy
Supervisors	
 Restarts
Supervisor	
 Behaviour


                                  tcp_rpc/src/tr_sup.erl




1.	
 tr_app	
 needs	
 to	
 start	
 this	
 top	
 level	
 supervisor
tcp_rpc	
 and	
 a	
 Concurrent	
 Server
                   the	
 Erlang/OTP	
 way



                                   Parent

                           spawn
                                                      spawn
   accept	
 tcp

                              request	
 for	
 new
                                 tr_server



               tr_server                                  tr_server
                                                       wai+ng	
 to	
 accept


                                                                                27
Lets	
 Play
Star2ng	
 The	
 App

 $ erl pa tcp_rpc/ebin
  Eshell V5.5.5 (abort with ^G)
  1> application:start(sasl).
  
  2> application:start(tcp_rpc).
  
  3> appmon:start().
Wrapping	
 Up




                 30

More Related Content

Behaviours and Applications

  • 1. Behaviours and Applica2ons gen_server, supervisor and applica2on
  • 2. What You Will 油京顎庄鉛糸
  • 3. The Protocol Module:Func+on(Arg1, ..., ArgN). <func+on return as text>
  • 4. In Broad Strokes Step 1: tr_server Step 2: OTP packaged 4
  • 5. How the Fundamental Pieces Fit Modules Send Processes Messages Contain Run Func+ons Are sent to
  • 6. Behaviour Basics Behaviour Interface Behaviour Implementa2on Behaviour Container 6
  • 7. Take a Look ex1.erl -足> ex2.erl -足> ex2behaviour.erl
  • 8. Example Behaviour Behaviour Interface init/0 handle_msg/2 Behaviour Implementa3on ex2 module Behaviour Container ex2behaviour module 1 to 1 process model contained in the ex2behaviour module 8
  • 9. gen_server Interface init/1 ronous handle_call/3 asyncronous handle_call/3 handle_info/2 lets talk later... 9
  • 10. gen_server Container gen_server:start_link/4 init/1 gen_server:call/2 handle_call/3 gen_server:cast/2 handle_cast/2 10
  • 11. Whats Calls What, Where? ?MODULE:store() -足> gen_server:call/2 Client process Dispatch to impl ?MODULE:handle_call/3 gen_server container 11
  • 12. Documenta2on -足 EDoc %%% File Scope @author @copyright %% Func+on Scope @doc @spec | -足spec @end 12
  • 13. Laying-足Out a Module { %%%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足 %%% @author Mar,n Logan <mar,njlogan@Macintosh.local> %%% @copyright (C) 2010, Mar,n Logan Header %%% @doc %%% %%% @end %%% Created : 15 Sep 2010 by Mar,n Logan <mar,njlogan@Macintosh.local> %%%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足 -足module(ex4). %% API -足export([]). { %%%=================================================================== %%% API %%%=================================================================== API %%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足 %% @doc my func,on. %% @end %%-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足-足 -足spec my_func(term) -足> ok. { %%%=================================================================== Internal %%% Internal func,ons %%%=================================================================== 13
  • 14. TCP Basics Server 1. Bind 2. Listen} gen_tcp:listen/2 3. Accept gen_tcp:accept/1 4. Send/Recv gen_tcp:send/1 handle_info/2 Client 1. Connect gen_tcp:connect/2 2. Send/Recv gen_tcp:send/1 handle_info/2 14
  • 15. Our TCP Handling gen_server tcp_rpc/src/tr_server.erl
  • 16. Tes2ng the Server $ erl pa tcp_rpc/ebin Eshell V5.5.5 (abort with ^G) 1> {ok, LSock} = gen_tcp:listen(8080, [{active, true}, {reuseaddr, true}]). 2> tr_server:start_link(LSock). From your standard command line (bash, sh, etc...): $? telnet localhost 8080 > io_lib:format(~p ~p~n, [hello, tr_server]).
  • 17. Applica2ons Ac+ve Library
  • 19. The Directory Layout <application-name>[-<version>] | |- doc |- ebin |- include |- priv |- src
  • 20. Applica2on Metadata %% -*- mode: Erlang; fill-column: 75; comment-column: 50; -*- {application, tcp_rpc, [{description, "RPC server for Erlang and OTP in action"}, {vsn, "0.1.0"}, {modules, [tr_app, tr_sup, tr_server]}, {registered, [tr_sup]}, {applications, [kernel, stdlib]}, {mod, {tr_app, []}} ]}.
  • 21. Applica2on Behavior tcp_rpc/src/tr_app.erl
  • 22. Applica2on is also a Behaviour Interface start/2, stop/1 Implementa2on tr_app.erl Container applica2on.erl Container has a one to many process architecture. 22
  • 26. Supervisor Behaviour tcp_rpc/src/tr_sup.erl 1. tr_app needs to start this top level supervisor
  • 27. tcp_rpc and a Concurrent Server the Erlang/OTP way Parent spawn spawn accept tcp request for new tr_server tr_server tr_server wai+ng to accept 27
  • 29. Star2ng The App $ erl pa tcp_rpc/ebin Eshell V5.5.5 (abort with ^G) 1> application:start(sasl). 2> application:start(tcp_rpc). 3> appmon:start().