本将主要内容:
1. !消息發送,fire-and-forget消息模型
2. ?消息發送,send-and-receive-future消息模型
akka提供了兩種消息模型:fire-and-forget和send-and-receive-future。fire-and-forget是一種單向消息發送模型,指的是異步發送消息,通過異步發送消息且消息發送後可以立即傳回,akka中使用?方法進行fire-and-forget消息發送,如stringactor!”creating actors with implicit val context”,它的意思是目前發送方aactor向stringactor發送字元串消息”creating actors with implicit val context”,發送完該消息後立即傳回,而無需等待stringactor的傳回,!還有個重載的方法tell;send-and-receive-future指的是異步發送消息則是一種雙向消息發送模型,向目标actor發送完消息後,然後傳回一個future作為後期可能的傳回,目前發送方actor将等待目标actor的傳回,akka中使用?方法進行send-and-receive-future消息的發送,它也同樣有一個重載的方法ask
代碼運作結果如下:
在exampleactor中,通過隐式變量context建立了otheractor執行個體:val other = context.actorof(props[otheractor], “otheractor”),在exampleactor的receive方法中,處理兩種不同類型的消息例如:
處理start類型的消息時,直接使用!進行消息發送,而處理run類型的消息時,使用的是tell方法,可以看到使用tell方法需要顯式地指定其sender,而使用!進行消息發送則不需要,事實上!方法通過隐式值傳入需要的sender,對比!與tell方法的定義便很容易了解
可以看到,tell方法的實作依賴于!方法。如果在一個actor當中使用!方法時,例如exampleactor中使用的other ! msg向otheractor發送消息,則sender隐式為exampleactor,如果不是在actor中使用則預設為actor.nosender,即sender為null。
了解了fire-and-forget消息模型後,接着對send-and-receive-future消息模型進行介紹,下面的代碼給出了其使用示例。
代碼中定義了3種類型的消息,分别是個人基礎資訊case class basicinfo(id:int,val name:string, age:int)、個人興趣資訊case class interestinfo(id:int,val interest:string)以及完整個人資訊case class person(basicinfo: basicinfo,interestinfo: interestinfo),然後為這3種類型的消息定義了相應的actor即basicinfoactor、interestinfoactor和personactor,在combineactor分别建立相應actor的執行個體,receive方法中使用ask向basicinfoactor、interestinfoactor發送send-and-receive-future模型消息,basicinfoactor、interestinfoactor中的receive方法接收到發送來的int類型消息并分别使用!向combineactor發送basicinfo、interestinfo消息,将結果儲存在future[person]中,然後通過代碼pipe(combineresult).to(personactor)将結果發送給personactor。
scala學習(公衆微信号:scalalearning)每天為大家帶來一點scala語言、spark、kafka、flink、akka等大資料技術幹貨及相關技術資訊。技術永無止境,勇攀高峰,一往直前!
覺得文章不錯?掃描關注
