SlideShare a Scribd company logo
1 of 30
Download to read offline
Behaviours	
  and	
  Applica2ons

gen_server,	
  supervisor	
  and	
  applica2on
What	
  You	
  Will	
  Build
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
                            let’s	
  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
What’s	
  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
Let’s	
  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

What's hot

Cd jun d_fut7[1]
Cd jun d_fut7[1]Cd jun d_fut7[1]
Cd jun d_fut7[1]
mm23bb
 
II Jornadas UPO
II Jornadas UPOII Jornadas UPO
II Jornadas UPO
ekipe
 
Tanda-tanda Khusnul dan Suul
Tanda-tanda Khusnul dan Suul Tanda-tanda Khusnul dan Suul
Tanda-tanda Khusnul dan Suul
Untsa Chacha
 
Corporate Profile Humanika Consulting
Corporate Profile Humanika ConsultingCorporate Profile Humanika Consulting
Corporate Profile Humanika Consulting
Seta Wicaksana
 
Penicilinas Cefalosporinas - Mario
Penicilinas Cefalosporinas - MarioPenicilinas Cefalosporinas - Mario
Penicilinas Cefalosporinas - Mario
Mario Lopez
 
Introducción a la administración f08
Introducción a la administración f08Introducción a la administración f08
Introducción a la administración f08
Skepper63
 
Id lemah lembut-sesama-ahlus-sunnah
Id lemah lembut-sesama-ahlus-sunnahId lemah lembut-sesama-ahlus-sunnah
Id lemah lembut-sesama-ahlus-sunnah
agungsmg
 
Procesos administrativos f07
Procesos administrativos f07Procesos administrativos f07
Procesos administrativos f07
Skepper63
 
Oracle statistical functions
Oracle statistical functionsOracle statistical functions
Oracle statistical functions
Maggie Giust
 

What's hot (19)

Cd jun d_fut7[1]
Cd jun d_fut7[1]Cd jun d_fut7[1]
Cd jun d_fut7[1]
 
II Jornadas UPO
II Jornadas UPOII Jornadas UPO
II Jornadas UPO
 
Uu no. 40 thn 2004 sjsn
Uu no. 40 thn 2004 sjsnUu no. 40 thn 2004 sjsn
Uu no. 40 thn 2004 sjsn
 
Se aprobó en primer debate proyecto de ley que permite la legalización del de...
Se aprobó en primer debate proyecto de ley que permite la legalización del de...Se aprobó en primer debate proyecto de ley que permite la legalización del de...
Se aprobó en primer debate proyecto de ley que permite la legalización del de...
 
Tanda-tanda Khusnul dan Suul
Tanda-tanda Khusnul dan Suul Tanda-tanda Khusnul dan Suul
Tanda-tanda Khusnul dan Suul
 
Corporate Profile Humanika Consulting
Corporate Profile Humanika ConsultingCorporate Profile Humanika Consulting
Corporate Profile Humanika Consulting
 
Penicilinas Cefalosporinas - Mario
Penicilinas Cefalosporinas - MarioPenicilinas Cefalosporinas - Mario
Penicilinas Cefalosporinas - Mario
 
Structure1 3
Structure1 3Structure1 3
Structure1 3
 
Introducción a la administración f08
Introducción a la administración f08Introducción a la administración f08
Introducción a la administración f08
 
Nota mensual d'actualitat econòmica Nov09
Nota mensual d'actualitat econòmica Nov09Nota mensual d'actualitat econòmica Nov09
Nota mensual d'actualitat econòmica Nov09
 
Nota mensual d'actualitat econòmica Gen10
Nota mensual d'actualitat econòmica Gen10Nota mensual d'actualitat econòmica Gen10
Nota mensual d'actualitat econòmica Gen10
 
Himachal bank
Himachal bankHimachal bank
Himachal bank
 
Preguntas frecuentes 20 de abril
Preguntas frecuentes 20 de abrilPreguntas frecuentes 20 de abril
Preguntas frecuentes 20 de abril
 
Id lemah lembut-sesama-ahlus-sunnah
Id lemah lembut-sesama-ahlus-sunnahId lemah lembut-sesama-ahlus-sunnah
Id lemah lembut-sesama-ahlus-sunnah
 
Procesos administrativos f07
Procesos administrativos f07Procesos administrativos f07
Procesos administrativos f07
 
Oracle statistical functions
Oracle statistical functionsOracle statistical functions
Oracle statistical functions
 
Gmr group overview
Gmr group overviewGmr group overview
Gmr group overview
 
Scarica pdf
Scarica pdfScarica pdf
Scarica pdf
 
Tafsir Al Usyr Al Akhir Dari Al Quran Al Karim_ Indonesia
Tafsir Al Usyr Al Akhir Dari Al Quran Al Karim_ IndonesiaTafsir Al Usyr Al Akhir Dari Al Quran Al Karim_ Indonesia
Tafsir Al Usyr Al Akhir Dari Al Quran Al Karim_ Indonesia
 

Viewers also liked (7)

Ross Golden Exam Review
Ross Golden Exam Review Ross Golden Exam Review
Ross Golden Exam Review
 
4 trends presentation website final
4 trends presentation   website final4 trends presentation   website final
4 trends presentation website final
 
Ch1
Ch1Ch1
Ch1
 
20120822 joxa
20120822 joxa20120822 joxa
20120822 joxa
 
Yin Yang Of Financial Reform
Yin Yang Of Financial ReformYin Yang Of Financial Reform
Yin Yang Of Financial Reform
 
Thiet kecsdl
 Thiet kecsdl Thiet kecsdl
Thiet kecsdl
 
Solving The Innovation Puzzle
Solving The Innovation PuzzleSolving The Innovation Puzzle
Solving The Innovation Puzzle
 

Behaviours and Applications

  • 1. Behaviours  and  Applica2ons gen_server,  supervisor  and  applica2on
  • 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 let’s  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. What’s  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().