本節主要内容
定義actor
建立actor
通過擴充akka.actor.actor 特質并實作receive方法來定義actor,代碼示例如下
receive方法被定義在actor當中,方法标簽如下
下面給出其完整使用代碼:
代碼運作結果:
輸出“[info] [04/02/2016 09:29:54.224] [myactorsystem-akka.actor.default-dispatcher-3] [akka://myactorsystem/user/myactor] received test”中的[myactorsystem-akka.actor.default-dispatcher-3]為對應的線程名,[akka://myactorsystem/user/myactor]為actor路徑資訊, received test為
方法處理後的輸出。關于[akka://myactorsystem/user/myactor]路徑資訊,将在後續内容中進行詳細闡述。
也可以通過混入actorlogging來實作日志功能,具體代碼如下:
actorlogging的定義如下:
完整代碼如下:
代碼原理與example_01類似,這裡不再贅述。
在前面兩個例子中,通過
建立actor,需要注意的是system.actorof方法傳回的是actorref對象,actorref為actor的引用,使用actorref對象可以進行消息的發送等操作。props為配置對象,在建立actor時使用,它是不可變的對象,是以它是線程案例且完全可共享的。akka中建立actor時,也允許直接傳入myactor對象的引用,例如
但是akka不推薦這麼做,官方文檔給出的解釋是這種方式會導緻不可序列化的props對象且可能會導緻競争條件(破壞actor的封裝性)。另外需要特别注意的是,不允許通過下列代碼建立actor
完整運作代碼如下:
運作結果如下:
從“you cannot create an instance of [chapter02.example_03$myactor] explicitly using the constructor (new). you have to use one of the ‘actorof’ factory methods to create a new actor.”可以看到,不能通過顯式地調用構造函數建立actor,隻能使用actorof工廠方法建立actor。
下面介紹2種在實際中經常使用的actor建立方法
(1)調用system.actorof建立actor
完整代碼在example_01、example_02中已經示範過了,這裡需要說明的是通過system.actorof工廠方法建立的actor為頂級actor

在akka架構中,每個akka應用程式都會有一個守衛actor,名稱為user,所有通過system.actorof工廠方法建立的actor都為user的子actor,也是整個akka程式的頂級actor。
(2)調用context.actorof建立actor
代碼運作結果
通過代碼的運作結果可以看到,firstactor的actor路徑資訊為akka://myactorsystem/user/firstactor,而通過
代碼使用context.actorof建立的myactor,其actor路徑資訊為[akka://myactorsystem/user/firstactor/mychild],這意味着mychild為firstactor的子actor,層次結構如下圖所示
也就是說context.actorof和system.actorof的差别是system.actorof建立的actor為頂級actor,而context.actorof方法建立的actor為調用該方法的actor的子actor