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方法修改如下
@Overridepublicvoid 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 PUThttp://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返回true且success的時候,表示操作成功。
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文件的頂層目錄下。
具體的參數調用,可以查看代碼中的高亮的部分。