Scala akka actor程式設計(一)

2022-03-29 07:37:46 字數 1481 閱讀 1546

akka中的actor遵循actor模型。你可以把actor當作是人。這些人不會親自去和別人交談。他們只通過郵件來交流。

1. 訊息傳遞 2. 併發 3. 異常處理 4. 多工 5. 訊息鏈

訊息傳送給actor**;

訊息是不可變物件(可帶有屬性的case class);

使用slf4j列印日誌:akka通過乙個叫做actorlogging的特質(trait)來實現的這一功能。可以這個trait混入(mixin)到類中。當我們要列印一條訊息的時候,actorlogging中的日誌方法會將日誌資訊發布到乙個eventstream流中。沒錯,我的確說的是發布。

eventstream:eventstream就像是乙個我們用來發布及接收訊息的訊息**。它與常見的訊息中介軟體的根本區別在於eventstream的訂閱者只能是乙個actor。defaultlogger預設訂閱這些訊息並列印到標準輸出。

akka

技術上來講,訊息傳送給actor就是希望能有***的。設計上便是如此。目標actor可以不做響應,也可以做如下兩件事情——

1. 給傳送方回覆一條響應(在本例中,teacheractor會將一句名言回覆給studentactor)

2. 將響應**給其它的目標受眾actor,後者也可以進行響應/**/產生***。router和supervisor就是這種情況。

排程器: 一次排程和迴圈排程。import context.dispatcher這條語句非常重要。schedule方法需要乙個非常重要的隱式引數——executioncontext。schedule方法只是把訊息傳送封裝到了乙個runnable中,而它最終是由傳進來的executioncontext來執行的。

prestart: actor重啟的時候(比如說崩潰了之後重啟)通過呼叫prestart方法還能重新初始化。而構造方法則實現不了這點(只會初始化一次)。

poststop: actorsystem.stop(), actorcontext.stop(), poisonpill 都可以終止乙個actor,關閉時**用poststop()

actor是純粹的分層結構。你所建立出來的actor必定是某個actor的子actor。actorref.path可以獲取到actor路徑。

子actor:當某個任務由乙個或多個子任務所組成的時候通常就會建立子actor。或者當某個任務由父actor執行比較容易出錯,而你希望將它進行隔離的時候,也可以使用子actor(這樣當子actor崩潰的時候,你還能夠恢復它)。如果不存在父子actor關係,就不要建立子actor。

監控(watch):不管actor是怎麼掛掉的,系統裡面會有些actor希望能夠知曉這一情況。actorcontext.watch和actorcontext.unwatch就是監控與取消監控的方法了。進行了監控之後,監控者會收到已停止的actor發來的一條terminated訊息,它們只需要把這個訊息放到receive函式的處理邏輯裡就好了。 

監督(supervision):只存在於父子關係的actor之間。

靜態聯編與動態聯編

在c 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...

靜態聯編和動態聯編

聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...

靜態聯編和動態聯編

聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...