Java Akka路由器的实现

Java Akka路由器的实现,java,java-8,akka,actor,Java,Java 8,Akka,Actor,我正在练习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 act

我正在练习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();
    }
}
Router
类创建了
Actor
类的五个实例。实例存储在一个列表中。配置路由器时,我正在对其应用
RoundRobinRoutingLogic


当我发送五条或更少的信息时,它工作得非常好。但是,当消息数超过5条时,它将显示死信错误。为什么?每次路由停止时,我都会添加一个新路由。有人能帮我吗?

参与者的启动和停止,以及
终止消息的生成,都是异步进行的。在您的问题上下文中,这意味着您无法保证,在路由器接收到第六条消息之前,您当前的设置已经向路由器添加了一个新的路由器。可能正在发生的事情是,路由器在消息中的速度如此之快,以至于当第六条
工作
消息到达时,还没有可用的路由


另一方面,将类命名为“Router”和“Actor”非常令人困惑,因为Akka API已经使用了这两个词。

Actor启动和停止以及
终止的消息的生成是异步发生的。在您的问题上下文中,这意味着您无法保证,在路由器接收到第六条消息之前,您当前的设置已经向路由器添加了一个新的路由器。可能正在发生的事情是,路由器在消息中的速度如此之快,以至于当第六条
工作
消息到达时,还没有可用的路由


另一方面,将类命名为“Router”和“Actor”非常令人困惑,因为Akka API已经使用了这些词。

Router类正在监视创建的路由。所以,每次路由对象死亡时,终止的消息都会被发送回。在那一刻,我移除routee并用一个新的routee替换它。这不应该显示死信信息,对吗@chunjef@bumblebee:已更新。路由器类正在监视创建的路由。所以,每次路由对象死亡时,终止的消息都会被发送回。在那一刻,我移除routee并用一个新的routee替换它。这不应该显示死信信息,对吗@chunjef@bumblebee:更新。
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();
    }
}