• [翻译]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」。转载请注明。

  • 相关阅读:
    MybatisPlus常用操作和配置
    C# Socket编程 同步以及异步通信
    PostgreSQL学习手册(PL/pgSQL过程语言)
    PostgreSQL学习手册(客户端命令<一>)
    PostgreSQL学习手册(服务器配置)
    PostgreSQL学习手册(系统视图)
    PostgreSQL学习手册(客户端命令<二>)
    PostgreSQL学习手册(角色和权限)
    PostgreSQL学习手册(数据库管理)
    PostgreSQL学习手册(系统表)
  • 原文地址:https://www.cnblogs.com/zhukunrong/p/4848850.html
Copyright © 2020-2023  润新知