Akka邊學邊寫(一)

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項目只依賴了兩個庫,分別是scalaactor。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:

[java] view plaincopy
  1. ActorSystem mySystem = ActorSystem.create("mySystem");  

ActorRef

整個Actor系統是很封閉的,Actor們從來不直接和外界接觸,它們把這種危險的事情交給自己的“經紀人”ActorRef去做。main()方法的第二行代碼調用ActorSystem的actorOf()方法創建了一個名爲myActor的Actor:

[java] view plaincopy
  1. ActorRef myActor = mySystem.actorOf(Props.create(MyActor.class), "myActor");  
到目前爲止,我們的Actor系統只有一個Actor,如下圖所示:

發消息,關閉Actor系統

main()方法的第三行代碼通過ActorRef的tell()方法給myActor發了一個消息:

[java] view plaincopy
  1. myActor.tell("Hello, World!", ActorRef.noSender());  
tell()方法是異步的,它只給Actor的郵箱放一封郵件,然後就返回了。tell()方法的第一個參數是消息,第二個參數是發送者,這樣,接收者Actor就知道是誰給自己發的消息了。MyActor並不關心消息是誰發送的,所以我們給它傳了ActorRef.noSender()。main()方法的第四行代碼調用ActorSystem的shutdown()方法,通知Actor系統終止自己:

[java] view plaincopy
  1. mySystem.shutdown();  
這就是全部的代碼,運行程序,可以看到控制檯裏打印出了我們期待已久的Hello, World!

結論

本文用Akka創建了一個HelloWorld項目,介紹了Akka的一些基本概念。下篇文章將用Akka創建一個EchoServer,介紹一下如何用Akka處理TCP協議。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章