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()
}
}