关闭ActorLogging #log可以吗?

时间:2017-07-13 00:16:17

标签: scala akka

我经常使用的代码使用log特征中的ActorLogging登录期货。如果我理解正确,这不行,因为此方法在此使用contexthttps://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/actor/Actor.scala#L316

可以吗?如果没有,是否足以将log保存到未来的val并使用它?

1 个答案:

答案 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注释时。