Akka是什麼呢?直接引用Akka網站上面的描述吧:
Akka is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on the JVM.
hello-world-java8項目
Akka同時提供了Java版和Scala版,本文的HelloWorld項目將使用Java版。該項目是我用NetBeans創建的Gradle項目,並且放到了Github上面。因爲是HelloWorld項目,所以很簡單,只有兩個類,如下圖所示:
build.gradle
先介紹一下build腳本:
如果腳本看起來比較吃力,可以先看看我寫的“看懂Gradle腳本”系列文章。前面沒什麼好解釋的,但是依賴部分我覺得有必要說明一下。我們的HelloWorld項目只依賴了兩個庫,分別是scala和actor。Akka主要是用Scala語言寫的,所以需要依賴Scala。而Akka本身非常的模塊化,HelloWorld項目只用到了Actor模塊,所以聲明瞭對Actor的依賴。注意Akka的模塊名包含了Scala版本號:akka-actor-_2.11,所以2.3.6纔是actor模塊的真正版本號。
MyActor
Akka的核心就是Actor模型,所以我們的HelloWorld自然要定義一個Actor:
MyActor繼承自UntypedActor(與之對應的是TypedActor,但我們還沒有足夠的知識來討論兩者的區別),UntypedActor是個抽象類,我們必須實現onReceive()方法。
信箱
在Actor的世界裏,Actor們是通過消息相互溝通的。每個Actor都有一個信箱(Mailbox),可以接收消息,然後一個個處理。但這些細節Akka都幫我們處理好了,我們的Actor要做的,就是實現onReceive()方法,然後每次處理一條消息。如上面的代碼所示,MyActor處理消息的方式是:把它打印到控制檯。
Main
HelloWorld的第二個類是Main,也就是程序主類,如下所示:
ActorSystem
從概念上講,n個相互協作的Actor組成一個系統,Akka提供了ActorSystem類來抽象Actor系統:
main()方法的第一行代碼創建了一個Actor系統,並起名爲mySystem:
- ActorSystem mySystem = ActorSystem.create("mySystem");
ActorRef
整個Actor系統是很封閉的,Actor們從來不直接和外界接觸,它們把這種危險的事情交給自己的“經紀人”ActorRef去做。main()方法的第二行代碼調用ActorSystem的actorOf()方法創建了一個名爲myActor的Actor:
- ActorRef myActor = mySystem.actorOf(Props.create(MyActor.class), "myActor");
發消息,關閉Actor系統
main()方法的第三行代碼通過ActorRef的tell()方法給myActor發了一個消息:
- myActor.tell("Hello, World!", ActorRef.noSender());
- mySystem.shutdown();
結論
本文用Akka創建了一個HelloWorld項目,介紹了Akka的一些基本概念。下篇文章將用Akka創建一個EchoServer,介紹一下如何用Akka處理TCP協議。