Akka學習筆記(1)-HelloWorld

Akka入門示例-HelloWorld

參考自:edwardsbean
- 創建Model

//case model
object Greeter{
  case object Greet
  case object Done
}
  • 創建執行任務的子Actor
class Greeter extends Actor {
   //處理接收到的消息
   def receive = {
     case Greeter.Greet => {
        println("Hello World")
        sender ! Greeter.Done
     }
   }
   //終止Actor的hook方法
   override def postStop = {
       println("greeter stoped")
   }
}
  • 創建根級Actor
class HelloWorld extends Actor{

    //啓動Actor時的hook方法
    override def preStart(): Unit = {
       //創建並啓動一個子Actor, 向其發送消息
       val greeter = context.actorOf(Props[Greeter], name = "greeter")
       greeter ! Greeter.Greet
    }
    //終止Actor時的hook方法
    override def postStop = {
       println("hello world post stop")
    }

    def receive = {
        //任務完成,終止Actor
        case Greeter.Done => context.stop(self)
    }
}
  • 執行該Akka Actor
object Main extends App {
     //akka.Main.main(Array(classOf[HelloWorld].getName))
     val system = ActorSystem("HelloWorld")
     system.actorOf(Props[HelloWorld], name = "helloworld")
}

執行結果如下:

[DEBUG] [02/15/2016 11:31:40.644] [main] [EventStream(akka://HelloWorld)] logger log1-Logging$DefaultLogger started
[DEBUG] [02/15/2016 11:31:40.645] [main] [EventStream(akka://HelloWorld)] Default Loggers started
[INFO] [02/15/2016 11:31:40.754] [main] [Remoting] Starting remoting
[INFO] [02/15/2016 11:31:41.105] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://[email protected]:5515]
[INFO] [02/15/2016 11:31:41.108] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://[email protected]:5515]
Hello World
greeter stoped
hello world post stop


如何發佈和使用Akka程序


Akka的使用方式一般有兩種:

  • 一種是作爲普通jar包使用
  • 一種是作爲服務使用

第一種使用方式比較好理解,第二種使用方式就是將依賴包與自定義actor一起打包,然後啓動自定義actor,下面是一個示例:

package zender.akka.test.one
import akka.actor.{Actor, ActorSystem, Props}
import akka.kernel.Bootable
case object Start

class HelloActor extends Actor {
   //創建一個子actor, worldActor
   val worldActor = context.actorOf(Props[WorldActor], name = "worldActor")

   def receive = {
     case Start => { worldActor ! "hello"}
     case message: String => {
         //打印子Actor返回的數據
         println("Receive message %s" format message)
     }
   }
}

class WorldActor extends Actor {
   def receive = {
       case  message: String => {
           //將處理後的信息 返回給發送者
           sender ! message.toUpperCase() + " world"
       } 
   }
}

//啓動類, 需要繼承 Bootable
class HelloKernel extends Bootable{
    val system = ActorSystem("HelloWorldSystem")

    override def startup = {
        system.actorOf(Props[HelloActor]) ! Start
    }
    override def shutdown = {
      system.shutdown()
    }
}
發佈了107 篇原創文章 · 獲贊 8 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章