2017-07-13 12 views
0

私がかなり頻繁に取り組んでいるコードは、ActorLogging形質のlogを使用して、先物の中にログを記録しています。私が正しく理解していれば、この方法ではcontextを使用しているため、これは問題ではありません。https://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/actor/Actor.scala#L316ActorLogging#logを閉じても問題ありませんか?

OKですか?そうでない場合は、logを将来外のvalに保存して使用すれば十分ですか?それはcontext.systemsystem.eventStream)から提供された非同期イベントバスを使用しているためdef log = akka.event.Logging(context.system, this)(簡易版)はスレッドセーフLoggingAdapter返すよう

+0

人々がより正確に回答できるようにコード例を提示する必要があります。 – Fabien

答えて

0

val myLogging = logはokです。 LoggingAdapterの唯一の非スレッドセーフバージョンはこれです:

def apply(logSource: Actor): DiagnosticLoggingAdapter 

それは基本的に

in API docsを述べていますように、あなたはakka.event.Logging.applyが公開されているとして、あなたが望む任意のロガーを作成することができます。

P.S. logは、他の場所に渡しても、あなたの俳優のクラスをソース名として使用することに注意してください。

P.S.2また、別のスレッドから直接log.blablaを呼び出すためにも、安全であるかもしれないのでdef log =はすでに、あなたのeventBusと役者(俳優インスタンスis used only for naming)で閉じられていることに気づくことができます。ここで唯一のことは、ダブルチェックロックがないため、_logの再初期化を引き起こす可能性があります。しかし、ここではJVMの高度に最適化されたバージョンについてはわかりません。特に、_logに@volatileアノテーションがない場合、「JavaMemoryModel」に従わないことがあります。

関連する問題