翻譯 AKKA筆記 Actor訊息 1(二)

2021-07-09 04:43:35 字數 2467 閱讀 8733

##訊息## 我們只是讓quoterequest到actorref去但是我們根本沒見過訊息類!

它是這樣的: (乙個最佳實踐是把你的訊息類包裝在乙個完整的物件裡以利於更好的組織)

teacherprotocol

package me.rerun.akkanotes.messaging.protocols

object

teacherprotocol

就像你知道的,quoterequest是用來發給teacheractor的。actor應該響應乙個quoteresponse回來。

##分發者dispatcher和郵箱mailbox##

actorref將訊息處理功能委託給dispatcher。在底層實現中,當我們建立乙個actorsystem和actorref的時候,乙個dispatcher和乙個mailbox也被建立出來了。讓我們看下他們。

###郵箱mailbox###

actor有乙個mailbox(稍後我們會看到乙個特例)。在我們的例子裡,每個老師都有乙個郵箱(mailbox)。老師需要檢查郵箱(mailbox)並且處理訊息。在actor的世界裡,是另一種樣子-郵箱(mailbox),當它有機會它會使用actor來完成它的工作。

郵箱維護乙個先入先出的佇列來儲存和處理訊息- 跟我們常規的收件箱有點不一樣,常規的收件箱總是最新的郵件在最上面。

###現在,分發者 dispatcher###

分發者做的事很有趣。表面上看,分發者只是從actorref拿到訊息然後將訊息發給mailbox。但是在這個場景裡有個很神奇的事情:

分發者包裝了executorservice(forkjoinpool或者threadpoolexecutor)。 它用這個executorservice來執行mailbox。

看一下這個dispathcer裡的片斷:

protected[akka] override def

registerforexecution

(mbox: mailbox, ...): boolean =

###什麼?你說你執行mailbox?###

是的。我們已經看到了mailbox將所有訊息維護在乙個佇列裡。當executor執行mailbox時,mailbox必須是乙個執行緒(thread)。就是這樣,這就是mailbox的宣告和建構函式。

這裡是mailbox的簽名

mailbox,當它的run方法被呼叫時,從佇列裡獲取一條訊息並把它發給actor來處理。

在你將訊息告知(tell)actorref的時候一定會呼叫到目標actor的receive方法。

這裡的teacheractor是個基本類,維護乙個格言列表(list)並自帶能處理訊息的方法receive。

看下這裡:

teacheractor.scala

package me.rerun.akkanotes.messaging.actormsg1

import scala.util.random

import akka.actor.actor

import me.rerun.akkanotes.messaging.protocols.teacherprotocol._

/* * your teacher actor class.

* * the class could use refinement by way of

* using actorlogging which uses the eventbus of the actor framework

* instead of the plain old system out

* */

class

teacheractor

extends

actor

}}

teacheractor只接受一種訊息格式-quoterequest(實際上,這個讓模式匹配預設case的方式是個好實踐,但這兒還是有個有趣的故事)

receive方法做的所有事是

根據模式匹配quoterequest

從格言的靜態列表(list)中隨機選取乙個格言

構造乙個quoteresponse

將quoteresponse列印到控制台

Akka學習筆記 Actor訊息傳遞 2

文章目錄 hide 3 teacher actor 我們在前面僅僅討論了actorref的quoterequest,並沒有看到message的類!這裡將介紹,如下 1packageme.rerun.akkanotes.messaging.protocols 2 3objectteacherproto...

Akka學習筆記06 Actor的訊息

向actor傳送訊息,分為兩種方式 1.tell,或者使用符號 沒有返回值。寫法如下 actor msg or actor.tell msg or actor tell msg 如果需要指定傳送訊息的actor,可以寫成 actor.tell msg,anotheractorref 2.ask,或者...

Akka學習筆記(3) Actor

actor是akka中的核心概念,它為併發和分布式提供了一種更高階別的抽象,使併發程式設計更加容易。定義actor 定義乙個actor非常簡單 繼承actor,並提供receive方法即可。不帶構造引數的actor class myactor1 extends actor 帶構造引數的actor c...