Behaviours and Applications

382 views

Published on

Strange Loop 2011 Erlang Workshop ->

Code is available -> https://github.com/ericbmerritt/strangeloop-behaviours-and-applications

Published in: Technology, Art & Photos
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
382
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Behaviours and Applications

  1. 1. Behaviours  and  Applica2onsgen_server,  supervisor  and  applica2on
  2. 2. What  You  Will  Build
  3. 3. The  ProtocolModule:Func+on(Arg1,  ...,  ArgN).<func+on  return  as  text>
  4. 4. In  Broad  StrokesStep  1:  tr_server Step  2:  OTP  packaged 4
  5. 5. How  the  Fundamental  Pieces  FitModules Send Processes Messages Contain Run Func+ons Are  sent  to
  6. 6. Behaviour  Basics• Behaviour  Interface• Behaviour  Implementa2on• Behaviour  Container 6
  7. 7. Take  a  Look ex1.erl  -­‐>  ex2.erl  -­‐>  ex2behaviour.erl
  8. 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. 9. gen_server  Interface init/1 ronous handle_call/3asyncronous handle_call/3 handle_info/2 let’s  talk  later... 9
  10. 10. gen_server  Containergen_server:start_link/4   init/1gen_server:call/2   handle_call/3gen_server:cast/2   handle_cast/2 10
  11. 11. What’s  Calls  What,  Where? ?MODULE:store()  -­‐>  gen_server:call/2Client  process Dispatch to  impl ?MODULE:handle_call/3 gen_server container 11
  12. 12. Documenta2on  -­‐  EDoc %%%  File  Scope @author @copyright %%  Func+on  Scope @doc @spec  |  -­‐spec @end 12
  13. 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. 14. TCP  Basics  Server1.  Bind2.  Listen} gen_tcp:listen/23.  Accept gen_tcp:accept/14.  Send/Recv gen_tcp:send/1 handle_info/2Client1.  Connect gen_tcp:connect/22.  Send/Recv gen_tcp:send/1 handle_info/2 14
  15. 15. Our  TCP  Handling  gen_server tcp_rpc/src/tr_server.erl
  16. 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. 17. Applica2onsAc+ve Library
  18. 18. Applica2on  Layout  
  19. 19. The  Directory  Layout  <application-name>[-<version>] | |- doc |- ebin |- include |- priv |- src
  20. 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. 21. Applica2on  Behavior tcp_rpc/src/tr_app.erl
  22. 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
  23. 23. Supervisors
  24. 24. Supervisors  Hierarchy
  25. 25. Supervisors  Restarts
  26. 26. Supervisor  Behaviour tcp_rpc/src/tr_sup.erl1.  tr_app  needs  to  start  this  top  level  supervisor
  27. 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
  28. 28. Let’s  Play
  29. 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().
  30. 30. Wrapping  Up 30

×