【问题标题】:Is it OK to close over ActorLogging#log?可以关闭 ActorLogging#log 吗?
【发布时间】:2017-07-13 00:16:16
【问题描述】:

我正在处理的代码经常使用来自ActorLogging 特征的log 在期货内部进行日志记录。如果我理解正确,这是不行的,因为这个方法在这里使用contexthttps://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/actor/Actor.scala#L316

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

【问题讨论】:

  • 您应该提供代码示例,以便人们可以更准确地回答。

标签: scala akka


【解决方案1】:

val myLogging = log 可以,因为def log = akka.event.Logging(context.system, this)(简化版)返回线程安全的LoggingAdapter,因为它使用了context.system (system.eventStream) 提供的异步事件总线。 LoggingAdapter 的唯一非线程安全版本是这样的:

 def apply(logSource: Actor): DiagnosticLoggingAdapter

正如in API docs所说的那样

基本上,您可以创建任何您想要的记录器,因为akka.event.Logging.apply 是公开的。

附:请注意,log 将使用您的 Actor 的类作为源名称,即使您将它传递到其他地方。

P.S.2 你还可以注意到def log = 已经在你的eventBus 和actor(actor 实例is used only for naming)上关闭,因此直接从另一个线程调用log.blabla 甚至可能是安全的。这里唯一可能会导致重新初始化_log,因为没有双重检查锁定。但是,我不确定这里有一些高度优化的 JVM 版本——它们可能不会精确地遵循“JavaMemoryModel”,尤其是当_log 上没有@volatile 注释时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2015-02-16
    • 2011-10-21
    相关资源
    最近更新 更多