1. 程式人生 > >AKKA文件(java版)—型別化角色

AKKA文件(java版)—型別化角色

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