Akka 通过Props实例创建Actor

Akka 通过Props实例创建Actor


Props作用

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");
    }
}

===============END===============

转载于:https://my.oschina.net/xinxingegeya/blog/366447

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值