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文件的顶层目录下。




具体的参数调用,可以查看代码中的高亮的部分。


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