说未引用的演员仍然订阅了事件流是否正确?至少,这是我从Akka实验中得到的......
我正在尝试在EventBus场景中为actor实现弱引用。在这些情况下,事件监听器/演员通常会来来去去。与应该一直存在的独立演员不同。显然取消注册当然可行。但我并不总是能够认识到这一点的合适时机。
Akka是否提供此类用例?
val as = ActorSystem.create("weak")
var actor = as.actorOf(Props[ExceptionHandler])
as.eventStream.subscribe(actor,classOf[Exception])
// an event is published & received
as.eventStream.publish(new KnownProblem)
//session expires or whatever that makes the actor redundant
actor = null
(1 to 30).foreach(_ => System.gc)
// an event is published & STILL received
as.eventStream.publish(new KnownProblem)
答案 0 :(得分:0)
好吧,我实际上无法实现它,但演员正停止在GC上。使用Scala 2.9.2(REPL)+ Akka 2.0.3。
EventBus
WeakReference[ActorRef]
没有帮助 - 因为在Akka中你还有dungeon
ChildrenContainer
(self.children
),也可能{ {1}}订阅生命周期事件。我没有尝试的事情 - 用调度员创建只知道我们新的闪亮Monitor
的演员 - 所以也许我错过了这一点?
这里是REPL的代码(使用适当的导入启动它,并在两个步骤中WeakEventBus
):
:paste