как правильно настроить Akka.Actors по сравнению с Scala.Actors - PullRequest
1 голос
/ 28 сентября 2011

Как мне запустить 2 актера Akka, когда вызывающий абонент отправляет сообщение потребителю каждые n секунд? Поскольку нет никаких методов обратной реакции, как в библиотеке Scala.Actors, я застрял как-то следующее не скомпилирует и выдаст:

метод переопределения получить в черту Actor типа => Caller.this.Receive; метод receive имеет несовместимый тип

object Foo {
  def init() {
    actorOf[Caller].start()
    actorOf[Consumer].start()
  }
}

class Caller extends Actor {

  def receive {
    while (true) {
      self ! "msg"
      Thread.sleep(1000)
    }
  }
}

class Consumer extends Actor {

  def receive = {
    case msg:String => doStuff()
    case e => _
  }
}

1 Ответ

3 голосов
/ 28 сентября 2011

Вы пропускаете знак равенства после receive в Caller.Без него метод определен как возвращающий Unit (т.е. без полезного значения), и akka требует, чтобы вы вернули PartialFunction[Any,Unit] от получения.

Теперь, чтобы реально реализовать свою логику идиоматическим способом, вы, вероятно, захотите использовать ReceiveTimeout, например так:

class Caller extends Actor {
  self.receiveTimeout = Some(1000)

  def receive = { 
    case ReceiveTimeout => 
      self ! "msg"
  }
}
...