akka fsm presentation

14
FINITE STATE MACHINES (FSM) WITH AKKA ACTORS WRITING AND UNIT TESTING 'EM "LIGHTNING TALK" BY PRASANNA KUMAR

Upload: prasanna-kumar

Post on 08-Sep-2014

135 views

Category:

Technology


0 download

DESCRIPTION

akka fsm talk given on Glassbeam

TRANSCRIPT

Page 1: Akka fsm presentation

FINITE STATE MACHINES(FSM)

WITH AKKA ACTORSWRITING AND UNIT TESTING 'EM

"LIGHTNING TALK" BY PRASANNA KUMAR

Page 2: Akka fsm presentation

WHAT IS FSM?when a program is in a state S and anevent E occurs then do an action A and

change to another state S1

If the above sounds too theoritical to understand ....

Page 3: Akka fsm presentation

IMAGINE A TRAFFIC SIGNALhope you could understand !!!

Page 4: Akka fsm presentation

WHY DO WE NEED FSM?AT LEAST FOR US ...

Model and Execute Rules (we are using it !!!)SimulationsAutomata based programming

Page 5: Akka fsm presentation

WHY THIS PRESENTATIONI want to learn FSM

Page 6: Akka fsm presentation

"FSM" FROM AKKA PERSPECTIVEStateDataMessages to the actor is analogous to EventsActor abstraction itself

sealed trait FSMSignal case class SignalColorData class SignalChangeFSMActor extends Actor with FSM[FSMSignal, SignalColorData] { ..... }

Page 7: Akka fsm presentation

LET'S MODEL FSM

// state - sealed trait FSMSignal case object RedSignal extends FSMSignal case object YellowSignal extends FSMSignal case object GreenSignal extends FSMSignal

// data case class SignalColorData

// event case object ChangeSignal case object RetainSignal

Page 8: Akka fsm presentation

ACTOR CODEclass SignalChangeFSMActor extends Actor with FSM[FSMSignal, SignalColorData] {

// initial state of FSM startWith(RedSignal, SignalColorData())

when(RedSignal) { case Event(ChangeSignal, _) => goto(YellowSignal) case Event(RetainSignal, _) => stay }

when(YellowSignal) { case Event(ChangeSignal, _) => goto(GreenSignal) case Event(RetainSignal, _) => stay }

Page 9: Akka fsm presentation

CONTD ... when(GreenSignal) { case Event(ChangeSignal, _) => goto(RedSignal) case Event(RetainSignal, _) => stay }

onTransition { case RedSignal -> YellowSignal => println("Changing from red to yellow signal - get ready to go") case YellowSignal -> GreenSignal => println("Changing from yellow to green signal - wroooom") case GreenSignal -> RedSignal => println("Changing from green to red signal - stop !!! :(") }

initialize}

Page 10: Akka fsm presentation

UNIT TESTING FSM ACTORS WITHclass FSMActorTest(as: ActorSystem) extends TestKit(as) with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { // all our test cases}

Page 11: Akka fsm presentation

val fsmRef = TestFSMRef(new SignalChangeFSMActor)

def this() = this(ActorSystem("FSMActorSystem"))

"Our signal emulating FSMActor" must { "be red at initial stage " in { assert(fsmRef.stateName == RedSignal) assert(fsmRef.stateData == SignalColorData()) } "change to yellow after AlternateColour event occured " in { fsmRef ! ChangeSignal // send an event to FSM assert(fsmRef.stateName == YellowSignal) assert(fsmRef.stateData == SignalColorData()) } "change to green after AlternateColour event occured" in { fsmRef ! ChangeSignal assert(fsmRef.stateName == GreenSignal) assert(fsmRef.stateData == SignalColorData()) } "retain should not change the fsm state" in { fsmRef ! RetainSignal assert(fsmRef.stateName == GreenSignal) assert(fsmRef.stateData == SignalColorData()) } } override def afterAll = { println("traffic is clear now - obey traffic rules") }

Page 12: Akka fsm presentation

SESSION TAKEAWAYCode :- https://github.com/prassee/FSMExperiment

Page 13: Akka fsm presentation

HOW I MADE THIS PRESENTATION ?HTML 5CSS 3Presentation :- reveal.jsImages courtesy :- google image search :)

This presentation is CCL licensed - feel free to modify

Page 14: Akka fsm presentation

THANKS :)