akka 學習筆記__akka

來源:互聯網
上載者:User

部落格地址: http://blog.csdn.net/yueqian_zhu/


一、actor啟動

Actor 在建立後將自動非同步地啟動。當你建立 Actor 時它會自動調用 Actor trait 的preStart 回調方法。這是一個非常好的用來添加actor初始化代碼的位置

actorOf的第一個參數是一個Props對象:

val myActor = context.actorOf(Props[MyActor], name = "myactor")val myActor = system.actorOf(Props(new MyActor("...")), name = “myactor”)也可以通過Props().withXXX()來設定。如Props().withCreator(new MyActor).withDispatcher(“my-dispatcher")
二、actor receive中的模式比對

如果希望處理未知的訊息,需要提供一個預設的case分支。否則會有一個 akka.actor.UnhandledMessage(message, sender, recipient) 被發布到 ActorSystem的 事件流(EventStream)中

三、在actor的receive中建立actor

需要避免調用外層actor的方法,這會破壞actor的封裝,可能會引入同步bug和資源競爭,因為其它的actor可能會與外層actor同時進行調度。 四、生命週期監控

使用DeathWatch進行生命週期監控:為了在其它actor結束時 收到通知, actor可以將自己註冊為其它actor在終止時所發布的 Terminated 訊息 的接收者. 這個服務是由actor系統的 DeathWatch 組件提供的。

val child = context.actorOf(Props.empty, "child")context.watch(child) // <-- 這是註冊所需要的唯一調用
之後,child結束後,能收到Terminated 訊息.

多次註冊並不表示會有多個訊息產生,也不保證有且只有一個這樣的訊息被接收到

可以使用 context.unwatch(target)來停止對另一個actor的生存狀態的監控, 但很明顯這不能保證不會接收到 Terminated 訊息因為該訊息可能已經進入了隊列。 五、ask/?

用來非同步發送一個訊息,並返回一個Future。ask調用需要implicit val timeout = Timeout(5 seconds)來指定逾時時間。其實ask 操作包括建立一個內部actor來處理回應,必須為這個內部actor指定一個逾時期限,過了逾時期限內部actor將被銷毀以防止記憶體泄露。

常用 pipeTo 在future上安裝一個 onComplete-處理器來完成將收集到的 Result 發送到其它actor的動作。如:

val f: Future[Result] = …f pipeTo actorA或者pipe(f) to actorA
如果ask的接收方處理異常時需要發送一個 Failure 訊息給發送方以填充Future。如:

try {  val result = operation()  sender ! result} catch {  case e: Exception ⇒    sender ! akka.actor.Status.Failure(e)    throw e}
如果一個actor沒有完成future, 它會在逾時時限到來時到期,以 AskTimeoutException來結束。此時需要onComplete之類的回調方法來處理ask調用觸發的異常AskTimeoutException,否則在異常發生時,actor執行個體將被丟棄而產生一個新的執行個體

六、轉寄訊息

你可以將訊息從一個actor轉寄給另一個。雖然經過了一個’中轉’,但最初的寄件者地址/引用將保持不變。

otherActor.forward(message)
七、熱替換 become/unbecome

become接收一個PartialFunction[Any,Unit]型別參數作為新的訊息處理實現,稱為熱替換。可以理解為一個棧,become後往棧頂push一個新的處理,unbecome後將棧頂的pop出來,又恢複之前的處理方式。

八、異常處理

訊息在處理過程中拋出異常,這個訊息將被丟失,不會被放回到郵箱中。所以如果你希望重試對訊息的處理,你需要自己抓住異常然後在異常處理流程中重試. 請確保你限制重試的次數,因為你不會希望系統產生活鎖 。郵箱沒有任何變化。如果actor被重啟,郵箱會被保留。郵箱中的所有訊息不會丟失。如果拋出了異常,actor執行個體將被丟棄而產生一個新的執行個體。 九、擴充訊息處理鏈

orElse
十、定時器

ActorSystem中有scheduler/scheduleOnce方法,返回一個Cancellable對象。可以通過cancel方法取消定時器。

十一、Await

通過Await.result和Await.ready來阻塞擷取future的結果,由於通過ask返回的類型為Future[Any],所以一般Await.result(future, timeout.duration).asInstanceOf[String]來進行類型轉換。在使用非阻塞方式時,最好使用mapTo將Future轉換到期望的類型。如果轉換成功, mapTo 方法會返回一個包含結果的新的 Future, 如果不成功,則返回 ClassCastException  十二、監管機制

在actor中通過override val supervisorStrategy來定義一個監管機制。

預設監管機制:

如果定義的監管機制沒有覆蓋拋出的異常,將使用上溯 機制.

如果某個actor沒有定義監管機制,下列異常將被預設地處理:

ActorInitializationException 將終止出錯的子 actor

ActorKilledException 將終止出錯的子 actor

Exception 將重啟出錯的子 actor

其它的 Throwable 將被上溯傳給父actor

如果異常一直被上溯到根監管者,在那兒也會用上述預設方式進行處理。 十三、Agent

Agent 提供對獨立的記憶體位置的非同步修改.對所有agent的更新操作在一個線程池的不同線程中並發執行。在每一個時刻,每一個Agent最多隻有一個 send 被執行. 從某個線程派發到agent上的操作的執行次序與其發送的次序一致,但有可能與從其它(線程)源派發來的操作交織在一起。 十四、測試

TestKit

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.