Props is a configuration class to specify options for the creation of actors, think of it as an immutable and thus
freely shareable recipe for creating an actor including associated deployment information (e.g. which dispatcher
to use, see more below).
创建Actor方式一
定义一个Actor,如下,
package com.usoft2;
import akka.actor.UntypedActor;
/**
* Created by liyanxin on 2015/1/12.
*/
public class MyActor extends UntypedActor {
private int x;
private int y;
public MyActor(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void onReceive(Object message) throws Exception {
System.out.println("message=" + message);
int result = x + y;
this.getSender().tell(result, this.getSelf());
this.getContext().stop(this.getSelf());
}
}
可以看到类中有一些属性变量,怎么通过Props.create方法使用其构造函数创建这个Actor?如下,
package com.usoft2;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;
/**
* Created by liyanxin on 2015/1/12.
*/
public class HelloWorld {
public static class StartActor extends UntypedActor {
@Override
public void preStart() throws Exception {
/**
* Props.create 方法,第一个参数是MyActor class,后边的参数是参数化列表,
* 表示传入其构造器的参数
*/
final ActorRef child =
getContext().actorOf(Props.create(MyActor.class, 4, 5), "myChild");
child.tell("good morning", this.getSelf());
}
@Override
public void onReceive(Object message) throws Exception {
System.out.println("result=" + message);
this.getContext().stop(this.getSelf());
}
}
public static void main(String args[]) {
ActorSystem system = ActorSystem.create("myActorSystem");
system.actorOf(Props.create(StartActor.class), "helloWorld");
}
}
这段代码表示传入 Acor构造器的参数,
final ActorRef child =
getContext().actorOf(Props.create(MyActor.class, 4, 5), "myChild");
child.tell("good morning", this.getSelf());
创建Actor方式二
定义Actor,同上,
package com.usoft2;
import akka.actor.UntypedActor;
/**
* Created by liyanxin on 2015/1/12.
*/
public class MyActor extends UntypedActor {
private int x;
private int y;
public MyActor(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void onReceive(Object message) throws Exception {
System.out.println("message=" + message);
int result = x + y;
this.getSender().tell(result, this.getSelf());
this.getContext().stop(this.getSelf());
}
}
定义ActorCreator,如下,
package com.usoft2;
import akka.japi.Creator;
/**
* Created by liyanxin on 2015/1/12.
*/
public class MyActorCreator implements Creator<MyActor> {
private int x;
private int y;
public MyActorCreator(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public MyActor create() throws Exception {
return new MyActor(x, y);
}
}
最后看如何通过AcorCreator创建Actor,如下,
package com.usoft2;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;
/**
* Created by liyanxin on 2015/1/12.
*/
public class HelloWorldCreator {
public static class StartActor extends UntypedActor {
@Override
public void preStart() throws Exception {
/**
* Props.create 方法,第一个参数是MyActor class,后边的参数是参数化列表,
* 表示传入其构造器的参数
*/
final ActorRef child =
getContext().actorOf(Props.create(new MyActorCreator(4, 5)), "myChild");
child.tell("good morning", this.getSelf());
}
@Override
public void onReceive(Object message) throws Exception {
System.out.println("result=" + message);
this.getContext().stop(this.getSelf());
}
}
public static void main(String args[]) {
ActorSystem system = ActorSystem.create("myActorSystem");
system.actorOf(Props.create(StartActor.class), "helloWorld");
}
}
这段代码表示如何通过Props.create方法使用 Creator 的对象创建一个Actor,如下,
final ActorRef child =
getContext().actorOf(Props.create(new MyActorCreator(4, 5)), "myChild");
child.tell("good morning", this.getSelf());
最佳实践
如下定义一个Actor,
package com.usoft2;
import akka.actor.Props;
import akka.actor.UntypedActor;
import akka.japi.Creator;
/**
* Created by liyanxin on 2015/1/12.
*/
public class MyActor2 extends UntypedActor {
private int x;
private int y;
public MyActor2(int x, int y) {
this.x = x;
this.y = y;
}
/**
* Create Props for an actor of this type.
* 这相当于一个静态工场方法,直接通过该静态方法创建Props instance
*/
public static Props props(final int x, final int y) {
return Props.create(new Creator<MyActor2>() {
private static final long serialVersionUID = 1L;
@Override
public MyActor2 create() throws Exception {
return new MyActor2(x, y);
}
});
}
@Override
public void onReceive(Object message) throws Exception {
System.out.println("message=" + message);
int result = x + y;
this.getSender().tell(result, this.getSelf());
this.getContext().stop(this.getSelf());
}
}
如上定义了直接返回 Props 实例的静态工厂方法,然后通过 Props instance 创建Actor,如下,
package com.usoft2;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;
/**
* Created by liyanxin on 2015/1/12.
*/
public class HelloWorld2 {
public static class StartActor extends UntypedActor {
@Override
public void preStart() throws Exception {
/**
* Props.create 方法,第一个参数是MyActor class,后边的参数是参数化列表,
* 表示传入其构造器的参数
*/
final ActorRef child =
getContext().actorOf(MyActor2.props(4, 7), "myChild");
child.tell("good morning", this.getSelf());
}
@Override
public void onReceive(Object message) throws Exception {
System.out.println("result=" + message);
this.getContext().stop(this.getSelf());
}
}
public static void main(String args[]) {
ActorSystem system = ActorSystem.create("myActorSystem");
system.actorOf(Props.create(StartActor.class), "helloWorld");
}
}