Akka& Java - 遇到死信

时间:2017-05-10 14:54:42

标签: java akka

我正在尝试创建一个Akka Actors系统,其中每个actor都可以创建几个新的子actor。 例如:Actor A读取200K行输入文件,读取每行将该文本行分配给Actor B. Actor B将根据某些业务逻辑创建Actor C,依此类推。

我在调度Actors B时面临一个不一致的行为,在某些时候我得到错误:

Message [java.lang.String] without sender to Actor[akka://My-Akka/user/$a/$b#304462457] was not delivered. [1] dead letters encountered. This logging can be turned off

错误可以在读取(并分派100行或1000行)后开始。每次奔跑都是不同的。

程序从一些Master类开始:

ActorSystem system = ActorSystem.create("My-Akka");
ActorRef actorA= system.actorOf(Props.create(ActorA.class));    
actorA.tell("some text", ActorRef.noSender());

在Actor A中我正在创建一个路由器:

    Router router;
{
    List<Routee> routees = new ArrayList<Routee>();
    for (int i = 0; i < 5; i++) {
        ActorRef r = getContext().actorOf(Props.create(ActorB.class));
        getContext().watch(r);
        routees.add(new ActorRefRoutee(r));
    }
    router = new Router(new RoundRobinRoutingLogic(), routees);
}

在Actor A的createReceive函数中:

    @Override
public Receive createReceive() {
    return receiveBuilder()
            .match(String.class, message -> {
                        ....
                        String line;
                        while ((line = br.readLine()) != null) {
                            router.route(line, getSender());
                        }
                    }
                }

            })
            .match(Terminated.class, message -> {
                router = router.removeRoutee(message.actor());
                ActorRef r = getContext().actorOf(Props.create(ActorB.class));
                getContext().watch(r);
                router = router.addRoutee(new ActorRefRoutee(r));
            })
            .build();
}

和Actor B的createReceive函数:

    @Override
public Receive createReceive() {
    return receiveBuilder()
            .match(String.class, s -> {
                System.out.println("got message " + s);
            })
            .matchAny(o -> logger.info("received unknown message"))
            .build();
}

我想我在这里失踪了。为什么看起来每次Actor A能够在到达死信之前向Actor B发送不同数量的消息。 是因为主程序在所有演员都在完成工作之前终止了吗?如果是这种情况,需要改变什么?

由于

1 个答案:

答案 0 :(得分:0)

似乎问题是由于在Junit上下文中运行程序,该程序在特定时间关闭系统并杀死演员。

一旦我以常规模式运行程序,问题就消失了。