理论教育 使用DeathWatch进行生命周期监控

使用DeathWatch进行生命周期监控

时间:2023-11-24 理论教育 版权反馈
【摘要】:注册一个监控器很简单,在例10-5中,WatchActor继承自Actor,在WatchActor内部使用context的actorOf工厂方法,创建一个child Actor,并通过context的watch方法将WatchActor注册到child Actor,完成对child Actor的监控注册。这样当child Actor终止时,WatchActor将收到child Actor发出的Terminated消息,并作相应的处理。可以使用context.unwatch来停止对一个Actor的生存状态的监控,但很明显这不能保证不会接收到Terminated消息因为该消息可能已经进入了队列。

使用DeathWatch进行生命周期监控

每个Actor需要同其他Actor协同工作,因此需要对协同工作的Actor的状态有所了解,怎样知道其他Actor的状态呢?为了在其他Actor结束时收到通知,Actor可以将自己注册为其他Actor在终止时所发布的Terminated消息的接收者。这个服务是由Actor系统的Death⁃Watch组件提供的。注册一个监控器很简单,在例10-5中,WatchActor继承自Actor,在WatchActor内部使用context的actorOf工厂方法,创建一个child Actor,并通过context的watch方法将WatchActor注册到child Actor,完成对child Actor的监控注册。这样当child Actor终止时,WatchActor将收到child Actor发出的Terminated消息,并作相应的处理。在Test5中,创建watchActor,并向其发送“kill”消息,watchActor收到“kill”消息之后,将会调用context的stop方法终止child Actor,由于watchActor中通过watch方法对child进行了监控,因此在child Actor终止后,watchActor会收到child Actor发出的Terminated消息。示例代码如例10-5所示。

【例10-5】DeathWatch生命周期监控示例。

978-7-111-54169-1-Chapter10-16.jpg

978-7-111-54169-1-Chapter10-17.jpg

运行结果如图10-6所示。(www.daowen.com)

978-7-111-54169-1-Chapter10-18.jpg

图10-6 使用context.watch进行状态监控

使用context的watch方法可以注册监控,那不想监控的时候如何取消呢?可以使用con⁃text.unwatch(targetActor)来停止对一个Actor的生存状态的监控,但很明显这不能保证不会接收到Terminated消息因为该消息可能已经进入了队列。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈