zoukankan      html  css  js  c++  java
  • 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"));
        }
    }
    
    
  • 相关阅读:
    网络编程(一)--网络编程介绍
    Python与设计模式之单例模式
    面向对象(六)--元类
    面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理
    面向对象(四)--绑定方法与非绑定方法(classmethod、staticmethod装饰器)
    面向对象(三)--多态、封装、property装饰器
    面向对象(二)--继承与派生、组合
    Django之中间件
    Django之auth认证
    Django之form主键
  • 原文地址:https://www.cnblogs.com/jj81/p/13966201.html
Copyright © 2011-2022 走看看