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返回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文件的顶层目录下。
具体的参数调用,可以查看代码中的高亮的部分。