听远程akka ActorSystem的日志流

时间:2015-06-19 12:20:33

标签: scala logging akka actor akka-remote-actor

我试图订阅远程akka ActorSystem的日志流,基本上是编写一个控制台,显示远程Actors的运行日志。

我能想到的唯一方法是:在日志记录ActorSystem中创建一个Actor,让Actor订阅ActorSystem.eventStream,然后在我的控制台中使用actorSelection订阅该Actor&#39 ; s ActorSystem。

但这似乎非常"间接"因为日志管道看起来像:

logging Actor --> eventStream --> Actor subscribed to eventStream --> local Actor

是否有更简单的方式订阅事件流?

1 个答案:

答案 0 :(得分:2)

从简单的角度来看,没有任何内容可以禁止您在没有其他actor的情况下为您的事件流订阅远程actor。 Akka documentation提及:

  

事件流是本地设施,意味着它不会   将事件分发到集群环境中的其他节点(除非   您明确地向流订阅了一个Remote Actor。如果你需要   在不知道收件人的情况下,在Akka群集中广播事件   显式(即获取他们的ActorRefs),你可能想看   into:分布式发布在群集中订阅。

为了便于说明,请考虑以下与远程系统对应的代码片段,即您要订阅的代码片段:

  class PublisherActor extends Actor with ActorLogging { // example publisher actor just to generate some logs
    context.system.scheduler.schedule(1.second, 1.second, self, "echo")
    def receive = {
      case "echo" ⇒
        val x = Random.nextInt(100)
        log.info(s"I got a random number: $x")
    }
  }

  def runPublisher() = {
    println("=== running publisher node ===")
    val system = ActorSystem("PublisherSystem")
    val selection = system.actorSelection("akka.tcp://SubscriberSystem@127.0.0.1:2553/user/subscriber")
    selection.resolveOne(10.seconds) onSuccess { // when the listener actor is available,
      case listener ⇒ system.eventStream.subscribe(listener, classOf[LogEvent]) // subscribe it to the event stream
    }
    val publisher = system.actorOf(Props[PublisherActor], "publisher") // some example publisher
  }

然后是" local"中的相应订阅者。节点,您要在其中显示日志:

  class SubscriberActor extends Actor with ActorLogging {
    log.info("subscriber listening...")
    def receive = {
      case msg ⇒ log.info(s"Got: $msg")
    }
  }

  def runSubscriber() = {
    println("=== running subscriber node ===")
    val system = ActorSystem("SubscriberSystem")
    val listener = system.actorOf(Props[SubscriberActor], "subscriber")
  }

但是,此解决方案有几个注意事项,因为发布者必须在订阅者之前运行(或订阅者在发布者启动之前实施某些重试策略),该位置是硬编码的等等。如果您希望拥有一个更强大,更有弹性的系统并且允许这样做,请遵循文档中的建议,并在集群环境中使用distributed publisher-subscriber,这在类似数量的样板文件中具有多项优势。

希望它有所帮助!