Akka/play(activator)2.5.3 創建工程 4

Akka/play(activator)2.5.3 創建工程


2016-5-20



5. 4 再給一種寫法

app/ controllers/MyController.java文件中myFunc方法修改如下:


importakka.util.Timeout;

importscala.concurrent.duration.Duration;


publicResult myFunc(String str1, String str2) throws Exception {

Logger.info("Class:[{}], Method: [{}], Message: [{}]",

"myController","myFunc", "para1: "+str1+", para2: "+str2);


Stringmessages = str1 + ":" + str2;


Timeouttimeout = new Timeout(Duration.create(1, "seconds"));


Future<Object>future = Patterns.ask(AkkaSystem.getMyActorPoolActorRef(), messages,timeout);

Stringresult = (String) Await.result(future, timeout.duration());

returnok( result );

}


添加app/actors/MyActorPool.java文件 OnReceive方法修改如下


@Override

publicvoid onReceive(Object message) throws Exception {

System.out.println(this.toString() );

if(message instanceof String) {

Stringstr = (String) message;

System.out.println("copied:\n"+ str);

getSender().tell("echo:\n"+ str, getSelf());

}else {

unhandled(message);

}

}


再次執行,執行4次,我們可以看到akka系統,自動創建了兩個MyActor的實例,並輪流響應客戶請求。

[root@xuyongshimytest]# curl -X PUT http://localhost:9000/my1/my2

echo:

my1:my2[root@xuyongshimytest]#


服務器所在的終端的輸出:

[info]application - Class: [myController], Method: [myFunc], Message:[para1: my1, para2: my2]

actors.MyActor@6bc1da7a

copied:

my1:my2

[info]application - Class: [myController], Method: [myFunc], Message:[para1: my1, para2: my2]

actors.MyActor@15592c1a

copied:

my1:my2

[info]application - Class: [myController], Method: [myFunc], Message:[para1: my1, para2: my2]

actors.MyActor@6bc1da7a

copied:

my1:my2

[info]application - Class: [myController], Method: [myFunc], Message:[para1: my1, para2: my2]

actors.MyActor@15592c1a

copied:

my1:my2


相關的代碼是

myActorPool= actorSystem.actorOf(

newRoundRobinPool(2).props(Props.create(MyActor.class)),

"myActorPool");



5.5 概要說明解釋


異步操作Future接口

異步操作,有兩個常用接口:Future Promise

Future 有一個表示異步操作結果的狀態值,這個值只能被賦值一次。isCompleted返回truesuccess的時候,表示操作成功。


Scala採用阻塞的方式,獲得異步操作的結果,常用的是Await.result方法。


角色編程


角色模型對編寫併發,分佈式系統進行了高度的抽象。


角色類繼承UntypedActor類,核心方法OnReceive

Props是配置類,Props.create(....創建 Actor實例

ActorSystem 類的actorOf 工廠方法, 接受 Props的實例


Actor接收消息的方法是OnReceive, 回覆消息時候,可以使用getSender得到一個角色引用,然後調用tell方法,發送迴應消息。


角色 還支持終止, 熱插拔,超時, 貯藏等特性。


配置

Akka使用Typesafe Config Library, 純java配置庫。

使用Akka,可以不用任何配置。

Akka 和配置之間的接口是 ActorSystem 的實例。 ActorSystem實例是 配置信息的唯一消費者。

Play conf目錄下, 默認生成以下 三個配置文件。

application.conf logback.xml routes

編譯後,這三個文件,複製到target/scala-2.11/classes 目錄下,也就是class文件的頂層目錄下。




具體的參數調用,可以查看代碼中的高亮的部分。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章