вызов метода от актера Akka метод получения не обрабатывает переданное сообщение - PullRequest
0 голосов
/ 29 августа 2018

В приведенном ниже фрагменте упрощенного кода, если функциональность приема отключена, он не обрабатывает входящие сообщения, как ожидалось.

package spack

import akka.actor.{Actor, ActorSystem, Props}
import com.typesafe.scalalogging.LazyLogging

object Main extends LazyLogging {

  import logger._

  def main(args: Array[String]): Unit = {
    debug("start of main")

    val system = ActorSystem("SampleSystem")

    val ref = system.actorOf(Props[SampleActor])

    ref ! "Hello"

    debug("end of main")

    Thread.sleep(Integer.MAX_VALUE)
  }
}

class SampleActor extends Actor with LazyLogging {

  import logger._


  override def receive: Receive = {


    case msg => {
      debug("now calling handle")
      handleMsg(msg)
    }


  }

  def handleMsg(msg1: Any): Receive = {
    case msg1 => debug(s"received msg is $msg1")
  }
}

Вывод приведенного выше фрагмента кода: -

22:06:17.889 [main] DEBUG spack.Main$ - start of main
22:06:18.569 [main] DEBUG spack.Main$ - end of main
22:06:18.569 [SampleSystem-akka.actor.default-dispatcher-5] DEBUG spack.SampleActor - now calling handle

Я ожидал, что ниже линии также на выходе, но как-то, это не придет.

получено сообщение "Привет"

1 Ответ

0 голосов
/ 29 августа 2018

Проблема:

handleMsg возвращает функцию Partial, называемую Receive, но не оценивает ее. Вот почему не отображается вывод

  1. Используйте context.become для поведения актера

или

  1. Сделать handleMsg функцию, возвращающую Единицу, вместо неоцененной Частичной функции

Определите свой handleMsg, как показано ниже

def handleMsg(arg: Any): Unit = arg match {
  case msg => debug(s"received msg is $msg")
}

или

def handleMsg: Receive = {
    case msg1 => debug(s"received msg is $msg1")
  }

Вы можете использовать стать

case msg => {
  debug("now calling handle")
  context become handleMsg
  self ! msg
}
...