You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.9 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #!/usr/bin/env amm
  2. import $ivy.`com.typesafe.akka::akka-actor-typed:2.6.8`
  3. import $ivy.`ch.qos.logback:logback-classic:1.2.3`
  4. import akka.actor.typed.delivery.ConsumerController.Command
  5. import akka.actor.Actor
  6. import akka.actor.typed.ActorRef
  7. import akka.actor.typed.ActorSystem
  8. import akka.actor.typed.Behavior
  9. import akka.actor.typed.scaladsl.Behaviors
  10. import akka.util.Timeout
  11. import scala.concurrent.duration._
  12. import akka.actor.typed.scaladsl.AskPattern._
  13. import scala.concurrent.ExecutionContext.Implicits.global
  14. import akka.actor.typed.scaladsl.AbstractBehavior
  15. import akka.actor.typed.scaladsl.ActorContext
  16. import scala.util.Success
  17. import scala.util.Failure
  18. import scala.concurrent.Await
  19. import scala.concurrent.Future
  20. object CounterActor {
  21. final case class CounterResult(count: Int)
  22. sealed trait Command
  23. final case object IncCount extends Command
  24. final case class GetResult(sender: ActorRef[CounterResult]) extends Command
  25. def apply(): Behavior[Command] =
  26. Behaviors.setup(ctx => new CounterActor(ctx))
  27. private class CounterActor(context: ActorContext[Command])
  28. extends AbstractBehavior[Command](context) {
  29. private var counter = 0 // encapsulated mutable state
  30. override def onMessage(msg: Command): Behavior[Command] = {
  31. msg match {
  32. case IncCount =>
  33. counter += 1
  34. Behaviors.same
  35. case GetResult(sender) =>
  36. context.log.info(s"Value of counter is $counter");
  37. sender ! CounterResult(counter)
  38. Behaviors.same
  39. }
  40. }
  41. }
  42. }
  43. object RootActor {
  44. sealed trait Command
  45. final case class Reply[T](reply: T) extends Command
  46. final case object Begin extends Command
  47. final case class GetResult(repyTo: ActorRef[CounterActor.CounterResult])
  48. extends Command
  49. implicit val timeout: Timeout = 3.seconds
  50. def apply(): Behavior[Command] =
  51. Behaviors.setup { context =>
  52. implicit val system = context.system
  53. val counterActor = context.spawn(CounterActor(), "counterActor")
  54. Behaviors.receiveMessage { message =>
  55. message match {
  56. case Reply(reply) => context.log.info(s"Received message $message")
  57. case Begin =>
  58. context.log.info("--- Beginning ---")
  59. counterActor ! CounterActor.IncCount
  60. counterActor ! CounterActor.IncCount
  61. counterActor ! CounterActor.IncCount
  62. counterActor ! CounterActor.IncCount
  63. counterActor ! CounterActor.IncCount
  64. case GetResult(replyTo) =>
  65. counterActor ! CounterActor.GetResult(
  66. replyTo
  67. )
  68. }
  69. Behaviors.same
  70. }
  71. }
  72. }
  73. @main
  74. def main() = {
  75. implicit val system =
  76. ActorSystem(RootActor(), "TestActors")
  77. implicit val timeout: Timeout = 3.seconds
  78. system ! RootActor.Begin
  79. // system ! RootActor.GetResult
  80. val x: Future[CounterActor.CounterResult] =
  81. system ? (ref => RootActor.GetResult(ref))
  82. Await.result(x, 1.second)
  83. }