Java Akka路由器的实现
我正在练习Akka路由,并在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
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();
}
}