first commit

This commit is contained in:
Rohan Sircar 2020-08-13 22:47:27 +05:30
commit 14eaf423f0
3 changed files with 130 additions and 0 deletions

93
ActorDemo.sc Executable file
View File

@ -0,0 +1,93 @@
#!/usr/bin/env amm
import $ivy.`com.typesafe.akka::akka-actor-typed:2.6.8`
import $ivy.`ch.qos.logback:logback-classic:1.2.3`
import akka.actor.typed.delivery.ConsumerController.Command
import akka.actor.Actor
import akka.actor.typed.ActorRef
import akka.actor.typed.ActorSystem
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
import akka.util.Timeout
import scala.concurrent.duration._
import akka.actor.typed.scaladsl.AskPattern._
import scala.concurrent.ExecutionContext.Implicits.global
object CounterActor {
sealed trait Command
final case object IncCount extends Command
final case class CounterResult(count: Int)
final case class GetResult(sender: ActorRef[RootActor.Command])
extends Command
var counter = 0
def apply(): Behavior[Command] =
Behaviors.receive { (context, command) =>
command match {
case IncCount => counter += 1
case GetResult(sender) =>
context.log.info(s"Value of counter is $counter");
sender ! RootActor.Reply(counter)
}
Behaviors.same
}
}
object RootActor {
sealed trait Command
case class Reply[T](reply: T) extends Command
case object Begin extends Command
case object GetResult extends Command
implicit val timeout: Timeout = 3.seconds
def apply(): Behavior[Command] =
Behaviors.setup { context =>
implicit val system = context.system
val counterActor = context.spawn(CounterActor(), "counterActor")
Behaviors.receiveMessage { message =>
message match {
case Reply(reply) => context.log.info(s"Received message $message")
case Begin =>
context.log.info("--- Beginning ---")
counterActor ! CounterActor.IncCount
counterActor ! CounterActor.IncCount
counterActor ! CounterActor.IncCount
counterActor ! CounterActor.IncCount
counterActor ! CounterActor.IncCount
case GetResult =>
counterActor ! CounterActor.GetResult(
context.self
)
}
Behaviors.same
}
}
}
@main
def main() = {
val t = new Thread(() => {
implicit val rootActor =
ActorSystem(RootActor(), "TestActors")
implicit val timeout: Timeout = 3.seconds
rootActor ! RootActor.Begin
rootActor ! RootActor.GetResult
})
t.setDaemon(true)
t.start()
Thread.sleep(1000)
System.exit(0)
}

20
LICENSE Normal file
View File

@ -0,0 +1,20 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute
this software, either in source code form or as a compiled binary, for any
purpose, commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and
to the detriment of our heirs and successors. We intend this dedication to
be an overt act of relinquishment in perpetuity of all present and future
rights to this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information,
please refer to <https://unlicense.org/>

17
README.md Normal file
View File

@ -0,0 +1,17 @@
# Akka Actors Demo
An experiment to see how the actor model can be used to synchronize / encapsulate mutable state without the use of locks.
## Usage
``` bash
./ActorsDemo.sc
```
Sample output:
```
22:11:47.473 [TestActors-akka.actor.default-dispatcher-3] INFO ammonite.$file.ActorDemo$RootActor$ - --- Beginning ---
22:11:47.475 [TestActors-akka.actor.default-dispatcher-6] INFO ammonite.$file.ActorDemo$CounterActor$ - Value of counter is 5
22:11:47.475 [TestActors-akka.actor.default-dispatcher-3] INFO ammonite.$file.ActorDemo$RootActor$ - Received message Reply(5)
```