zoukankan      html  css  js  c++  java
  • [翻译]AKKA笔记

    在前两章
    ,

    ,我们大致讲了Actor和message是怎么工作的,让我们看一下日志和测试我们的 TeacherActor .

    RECAP

    这是上一节我们的Actor代码:

    class TeacherActor extends Actor {
    
      val quotes = List(
        "Moderation is for cowards",
        "Anything worth doing is worth overdoing",
        "The trouble is you think you have time",
        "You never gonna know if you never even try")
    
      def receive = {
    
        case QuoteRequest => {
    
          import util.Random
    
          //Get a random Quote from the list and construct a response
          val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))
    
          println (quoteResponse)
    
        }
      }
    }
    

    用SLF4J给AKKA记录日志(LOGGING)#

    你可能注意到我们打印了quoteResponse到标准控制台,这明显是个坏主意。让我们把这个日志改成是用SLF4J.

    1.将CLASS改成使用日志

    Akka提供一个不错的特性叫做ActorLogging来达到这个目的,让我们把他加进去:

    class TeacherLogActor extends Actor with ActorLogging {
    
       val quotes = List(
        "Moderation is for cowards",
        "Anything worth doing is worth overdoing",
        "The trouble is you think you have time",
        "You never gonna know if you never even try")
    
      def receive = {
    
        case QuoteRequest => {
    
          import util.Random
    
          //get a random element (for now)
          val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))
          log.info(quoteResponse.toString())
        }
      }
    
      //We'll cover the purpose of this method in the Testing section
      def quoteList=quotes
    
    }
    

    这里有点绕:

    当我们给一条消息打日志,ActorLogging中的 logging方法发布(publishes)一条log消息到EventStream。是的,我说的是publish。 所以,这个EventStream是什么呢?

    EventStream and Logging

    EventStream的行为就像是一个消息代理,我们可以收发消息。跟常规的MOM (面向消息的中间件)的区别就是EventStream的订阅者只能是一个Actor。

    在logging meassage的场景中,所有的日志消息都会发布给EventStream。而缺省的订阅这些消息的Actor是DefaultLogger,其就是简单的将消息打印到标准控制台。

    class DefaultLogger extends Actor with StdOutLogger {  
        override def receive: Receive = {
            ...
            case event: LogEvent ⇒ print(event)
        }
    }
    

    所以,这就是我们启动StudentSimulatorApp的原因,我们看到日志消息被打印到了控制台。

    这就是说,EventStream不只是能做logging。他是在VM中的ActorWorld里的一个通用的发布-订阅机制。


    回到SLF4J配置:

    配置AKKA使用SLF4J

    akka{  
        loggers = ["akka.event.slf4j.Slf4jLogger"]
        loglevel = "DEBUG"
        logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
    }
    

    我们将这个信息保存在你classpath上的一个叫application.conf的文件中。在我们sbt的目录结构中,我们应该放在你的main/resources目录中。

    在配置文件中,我们可以看出:

    1.loggers的属性指出Actor要去订阅log events。而Slf4jLogger干的就是简单的消费log messages并且将其带离给SLF4J日志facade。
    2.loglevel属性指出了logging的最小级别。
    3.logging-filter比较当前配置的loglevel和进来的log消息级别并且将低于配置的log级别的消息截断后发送给EventStream。

    但在之前的例子中我们为什么没有application.conf?

    简单的解释就是Akka提供一种默认机制所以我们不需要写一个配置文件。这个文件里我们有很多可以定制的东西。在application.conf中我们有一大堆有趣的参数可以做定制化。这里是一些细节信息。

    未完待续

    原文链接:
    http://rerun.me/2014/09/29/akka-notes-logging-and-testing/


    文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。

  • 相关阅读:
    CentOS虚拟机和物理机共享文件夹实现
    集训第六周 数学概念与方法 概率 数论 最大公约数 G题
    集训第六周 数学概念与方法 概率 F题
    集训第六周 E题
    集训第六周 古典概型 期望 D题 Discovering Gold 期望
    集训第六周 古典概型 期望 C题
    集训第六周 数学概念与方法 UVA 11181 条件概率
    集训第六周 数学概念与方法 UVA 11722 几何概型
    DAG模型(矩形嵌套)
    集训第五周 动态规划 K题 背包
  • 原文地址:https://www.cnblogs.com/zhukunrong/p/4848850.html
Copyright © 2011-2022 走看看