Classic Actor | Props

Props是用于指定创建一个actor的选项的配置类,它是一个final class,因此可以把它视为不可变,可以共享用于创建actor的信息(例如指定哪个dispatcher)

import akka.actor.Props;
Props props1 = Props.create(MyActor.class);
// 展示了如何将构造函数参数传递给正在创建的参与者,但是它只能在参与者之外使用。但这个不推荐使用,因为会破坏actor的封装性
Props props2 = Props.create(ActorWithArgs.class, () -> new ActorWithArgs("arg"));  
//展示传入构造参数的情况
//会验证参数,如果没有找到或找到多个匹配构造函数,则会出现IllegalArgumentException异常。
Props props3 = Props.create(ActorWithArgs.class, "arg");

优雅创建Actor实践

import akka.actor.AbstractActor;import akka.actor.Props;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import java.util.HashMap;
import java.util.Map;
public class RequestActor4 extends AbstractActor {
    protected final String name;
    protected final LoggingAdapter log = Logging.getLogger(context().system(),this);
    protected final Map<String, Object> map = new HashMap<>();
    public RequestActor4(String name) {
        this.name = name;
    }
    //将Props封装到Actor中,通过RequestActor4.Props(actorName)调用
    static Props props(String name) {
        return Props.create(RequestActor4.class, name);
    }
    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(String.class,message->{
                    log.info("Received Request {}",message);
                    map.put("StringMessage",message);
                })
                .matchAny(o->log.info("Received unknow message {}",o))
                .build();
    }
}

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.testkit.TestActorRef;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class RequestActorTest {
    ActorSystem system = ActorSystem.create();
    @Test
    public void test() {
      //采用工厂模式,传入Actor name 参数生成actor
        TestActorRef<RequestActor4> actorRef = TestActorRef.create(system, RequestActor4.props("request"));
        actorRef.tell(String.valueOf("this is a message"), ActorRef.noSender());
        RequestActor4 requestActor = actorRef.underlyingActor();
        assertEquals("request",requestActor.name);
        assertEquals("this is a message",requestActor.map.get("StringMessage"));
    }
}

原文地址:https://www.cnblogs.com/jj81/p/13966201.html