Akka 2.5.8计算Pi时结果翻倍及死信问题求助
问题拆解与修复方案
咱们一步步解决你用Akka 2.5.8计算圆周率时遇到的Pi值翻倍、死信报错、系统关闭替代这三个问题:
1. Pi值翻倍的根源与修复
你的代码重复发送了计算任务,导致结果被累加了两次:
- 在
Master的构造函数中,已经循环发送了nrOfMessages次Work消息 - 随后
calculate方法又给Master发送了Calculate消息,Master收到该消息后再次发送了nrOfMessages次Work消息
两次任务的计算结果叠加,最终Pi值就变成了正确值的两倍。
修复方法:移除Master构造函数中的任务发送逻辑,只保留Calculate消息处理中的任务分发(更符合Actor的消息驱动设计):
public Master(int nrOfWorkers, int nrOfMessages, int nrOfElements, ActorRef listener) { this.nrOfMessages = nrOfMessages; this.nrOfElements = nrOfElements; this.listener = listener; for (int i = 0; i < nrOfWorkers; i++) { ActorRef f = getContext().actorOf(Props.create(Worker.class)); getContext().watch(f); routeeList.add(new ActorRefRoutee(f)); } workerRouter = new Router(new RoundRobinRoutingLogic(), routeeList); // 删掉这里的任务发送循环,让Calculate消息触发任务分发 }
2. 死信问题的解决
死信出现的核心原因有两个:
- 重复发送的任务中,部分
Work消息在Master停止后才被路由到Worker,Worker处理完成后回复的Result找不到接收者 - Master提前停止后,未清理Worker Actor,后续的消息投递无目标
结合上面的重复任务修复,再优化Master的结果处理逻辑:当所有结果收集完成后,先停止所有Worker,再停止自身,避免残留消息:
builder.match(Result.class, r -> { pi += r.getValue(); nrOfResults += 1; if (nrOfResults == nrOfMessages) { long duration = System.currentTimeMillis() - start; listener.tell(new PiApproximation(pi, duration), getSelf()); // 先停止所有Worker Actor for (Routee routee : routeeList) { getContext().stop(routee.getActor()); } getContext().stop(getSelf()); } });
3. 替换旧版的system().shutdown()
Akka 2.5+推荐使用CoordinatedShutdown实现优雅关闭,你可以在Listener收到计算结果后触发系统关闭:
public static class Listener extends AbstractActor { @Override public Receive createReceive() { ReceiveBuilder builder = ReceiveBuilder.create(); builder.match(PiApproximation.class, p -> { System.out.println(String.format("\n\tPi approximation: " + "\t\t%s\n\tCalculation time: \t%s", p.getPi(), p.getDuration())); // 用CoordinatedShutdown优雅关闭ActorSystem CoordinatedShutdown.get(getContext().getSystem()).run(CoordinatedShutdown.unknownReason()); }); builder.matchAny(o -> unhandled(o)); return builder.build(); } }
完成以上修改后,你会得到接近真实值的Pi结果,死信报错会消失,系统也会在计算完成后正常关闭。
内容的提问来源于stack exchange,提问作者jakub1998
相关产品推荐
相关产品推荐

