AKKA文件(java版)—型別化角色
阿新 • • 發佈:2018-12-23
3.2 型別化角色
Akka的型別化角色是活動物件(Active Object)模式的實現。Smalltalk誕生的時候,預設的方法呼叫由非同步派發代替同步操作。
型別化角色由2部分組成,包括一個公共的介面和實現,如果你有“企業級”Java的開發經驗,這對你來說會非常熟悉。與普通的角色一樣,你有一個外部的API(公共介面例項),將非同步的方法呼叫委託給實現類的一個私有例項。
型別化角色對比角色的優勢是你可以有一個靜態的約定,而不需要去定義你自己的訊息,不好的一面就是它會限制你能做什麼和不能做什麼,比如你不能使用become/unbecome。
型別化角色是利用JDK Proxies 來實現的,它提供一個非常簡單的API去呼叫攔截方法。
注意
正如普通的非型別化角色一樣,型別化角色每次處理一次呼叫。
3.2.1 什麼時候使用型別化角色
型別化角色是角色系統和非角色程式碼之間的美好橋樑,因為它們允許你在外部編寫正常的面向物件程式碼。把它們想象成門:它們實際上是公共部分和私有部分之間的介面,但你並不想你的房子有很多的門,不是嗎?你可以通過this blog post檢視更詳細的討論。
更多的背景:TypedActor很容易作為RPC被濫用,因此TypedActor並不是我們一開始想象中的那樣,能夠更加容易的去正確編寫高可擴充套件的併發軟體。我們要在合適的地方使用它們。
3.2.2 工具箱
在建立第一個型別化角色之前,我們先了解一下這個工具,掌握它的功能,它位於akka.actor.TypedActor。
//返回型別化角色的表示式 TypedActorExtension extension = TypedActor.get(system); //系統是一個ActorSystem物件</p> //返回引用是否是一個型別化角色代理 TypedActor.get(system).isTypedActor(someReference); //返回一個外部型別化角色代理的AKKA角色 TypedActor.get(system).getActorRefFor(someReference); //返回當前ActorContext //方法僅在一個TypedActor的方法實現中有效 ActorContext context = TypedActor.context(); //返回當前型別化角色的外部代理 //方法只在TypedActor的方法實現中有效 Squarer sq = TypedActor.<Squarer>self(); //返回一個型別化角色的上下文例項 //這意味著如果你使用它建立了其它的型別化角色例項 //它們將是當前這個型別化角色的子角色 TypedActor.get(TypedActor.context());
警告
型別化角色和akka角色一樣不暴露this引用,這一點很重要。你應該通過外部代理引用,它可以通過TypedActor.self來獲得,這是你的對外身份標識,就像akka角色的對外身份標識是ActorRef一樣。
3.2.3 建立型別化角色
建立型別化角色需要有一個以上的介面和一個實現介面的類。
假設入口如下所示:
import akka.actor.TypedActor; import akka.actor.*; import akka.japi.*; import akka.dispatch.Futures;</p> import scala.concurrent.Await; import scala.concurrent.Future; import scala.concurrent.duration.Duration; import java.util.concurrent.TimeUnit; import java.util.List; import java.util.ArrayList; import java.util.Random; import akka.routing.RoundRobinGroup; public class TypedActorDocTest { Object someReference = null; ActorSystem system = null; static public interface Squarer { void squareDontCare(int i); //fire-forget(審校者注:這個詞怎麼翻譯?) Future<Integer> square(int i); //非阻塞send-request-reply Option<Integer> squareNowPlease(int i);//阻塞send-request-reply int squareNow(int i); //阻塞send-request-reply } static class SquarerImpl implements Squarer { private String name; public SquarerImpl() { this.name = "default"; } public SquarerImpl(String name) { this.name = name; } public void squareDontCare(int i) { int sq = i * i; //Nobody cares