【问题标题】:Akka Router ImplementationAkka 路由器实现
【发布时间】:2018-03-16 09:33:50
【问题描述】:

我正在练习 Akka 路由,并在 Akka 文档中找到了此代码。

路由器类:

public class Router extends AbstractActor {

    private List<Routee> routees = new ArrayList<Routee>();

    akka.routing.Router router;
    {

        for(int i=1;i<=5;i++) {
            ActorRef actor = getContext().actorOf(Props.create(Actor.class));
            getContext().watch(actor);
            routees.add(new ActorRefRoutee(actor));
            System.out.println("Routee added");
        }

        router = new akka.routing.Router(new RoundRobinRoutingLogic(), routees);

    }

    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(Work.class, work -> {
                    router.route(work, getSender());
                })
                .match(Terminated.class, terminated -> {

                    System.out.println("Got actor terminated message");

                    router.removeRoutee(new ActorRefRoutee(terminated.actor()));
                    ActorRef actor = getContext().actorOf(Props.create(Actor.class));
                    getContext().watch(actor);
                    router.addRoutee(new ActorRefRoutee(actor));

                    System.out.println("Routee added back");
                })
                .build();
    }
}

演员类:

public class Actor extends AbstractActor {

    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(Work.class, work -> {
                    System.out.println("Work message received");
                    getContext().stop(getSelf());
                })
                .build();
    }
}

Router 类创建了Actor 类的五个实例。实例存储在列表中。我在配置路由器时应用了RoundRobinRoutingLogic

当我发送五个或更少的消息时,它可以完美运行。但是当消息的数量超过五个时,它会显示一个死信错误。为什么?每次停止路由时,我都会添加一个新的路由。谁能帮我解决这个问题?

【问题讨论】:

    标签: java java-8 akka actor


    【解决方案1】:

    Actor 的启动和停止以及Terminated 消息的生成都是异步发生的。这在您的问题的上下文中意味着您不能保证,在您当前的设置下,在路由器收到第六条消息之前已将新的路由添加到路由器。可能发生的情况是路由器处理消息的速度如此之快,以至于当第六个Work 消息到达时,还没有可用的路由。

    顺便说一句,将您的类命名为“Router”和“Actor”非常令人困惑,因为 Akka API 已经使用了这些词。

    【讨论】:

    • Router 类正在监视创建的路由。因此,每次 routee 死亡时,都会发回终止的消息。在那一刻,我删除了 routee 并用一个新的替换它。这不应该显示死信消息吗? @chunjef
    • @bumblebee:已更新。
    猜你喜欢
    • 2015-10-30
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多