【发布时间】: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。
当我发送五个或更少的消息时,它可以完美运行。但是当消息的数量超过五个时,它会显示一个死信错误。为什么?每次停止路由时,我都会添加一个新的路由。谁能帮我解决这个问题?
【问题讨论】: