我经常使用的代码使用log
特征中的ActorLogging
登录期货。如果我理解正确,这不行,因为此方法在此使用context
:https://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/actor/Actor.scala#L316
可以吗?如果没有,是否足以将log
保存到未来的val
并使用它?
答案 0 :(得分:0)
val myLogging = log
没问题,因为def log = akka.event.Logging(context.system, this)
(简化版)返回线程安全LoggingAdapter
,因为它使用context.system
提供的异步事件总线({{1} }})。 system.eventStream
唯一的非线程安全版本是:
LoggingAdapter
正如它所说in API docs
基本上,您可以创建所需的任何记录器,因为 def apply(logSource: Actor): DiagnosticLoggingAdapter
是公开的。
P.S。请注意akka.event.Logging.apply
将使用您的Actor的类作为源名称,即使您将其传递到其他位置也是如此。
PS2您还可以注意到log
和演员(演员实例is used only for naming)已关闭def log =
,因此调用eventBus
可能更安全直接从另一个线程。这里唯一可能会导致重新初始化log.blabla
,因为没有双重检查锁定。但是,我不确定这里有一些高度优化的JVM版本 - 它们可能不会遵循" JavaMemoryModel"特别是当_log
上没有@volatile注释时。