閱讀105 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Akka學習筆記(一):創建Hello World工程


Akka學習筆記(一):創建Hello World工程

創建工程

使用IDEA,創建SBT工程,在build.sbt中添加akka依賴:

name := "My Project"

version := "1.0"

scalaVersion := "2.10.4"

resolvers += "Typesafe Repository" at "https://repo.typesafe.com/typesafe/releases/"

libraryDependencies +=
  "com.typesafe.akka" %% "akka-actor" % "2.3.4"

如果SBT版本低於0.12,需要更改依賴為:

libraryDependencies +=
  "com.typesafe.akka" % "akka-actor_2.10" % "2.3.4"

其他IDE,構建方式,請看here

Hello World

完整代碼可以在這裏下載

HelloWorld.scala

我們創建HelloWorld.scala,代碼如下:

class HelloWorld extends Actor {

  override def preStart(): Unit = {
    // create the greeter actor
    val greeter = context.actorOf(Props[Greeter], "greeter")
    // tell it to perform the greeting
    greeter ! Greeter.Greet
  }

  def receive = {
    // when the greeter is done, stop this actor and with it the application
    case Greeter.Done => context.stop(self)
  }
}

HelloWorld是我們這個應用的中心(main),它會啟動和關閉所有actor(Greeter)

Greeter.scala
object Greeter {
  case object Greet
  case object Done
}

class Greeter extends Actor {
  def receive = {
    case Greeter.Greet =>
      println("Hello World!")
      sender() ! Greeter.Done
  }
}

Greeter的內容很簡單,一旦它被創建,等待接受消息,打印Hello World!,並告訴調用者Greeter.Done

Main.scala

讓我們運行這個程序吧,很簡單,指定負責調度的Actor:HelloWorld就可以了:

object Main {

  def main(args: Array[String]): Unit = {
    akka.Main.main(Array(classOf[HelloWorld].getName))
  }
}

運行:

Hello World!
[INFO] [07/25/2014 15:11:43.147] [Main-akka.actor.default-dispatcher-4] [akka://Main/user/app-terminator] application supervisor has terminated, shutting down

如何發布和使用Akka程序

有兩種方式:

  • 當做jar包使用
  • 作為單獨的服務,使用Akka Microkernel,詳見here
Akka Microkernel

大致就是,把依賴包放到lib/*,通過啟動類如(HelloKernel)啟動:

bin/akka sample.kernel.hello.HelloKernel

helloKernel代碼如下:

package sample.kernel.hello

import akka.actor.{ Actor, ActorSystem, Props }
import akka.kernel.Bootable

case object Start

class HelloActor extends Actor {
  val worldActor = context.actorOf(Props[WorldActor])

  def receive = {
    case Start => worldActor ! "Hello"
    case message: String =>
      println("Received 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("hellokernel")

  def startup = {
    system.actorOf(Props[HelloActor]) ! Start
  }

  def shutdown = {
    system.shutdown()
  }
}

最後更新:2017-04-03 05:39:33

  上一篇:go Akka學習筆記(四):監督和監控
  下一篇:go Cocos2d-x開發實例:使用Lambda 表達式