简体   繁体   中英

Scala actor call an actor trouble

I start work with akka actors, and write code, what works, but not exactly how i expect:

import com.mongodb.casbah.Imports
import com.mongodb.casbah.Imports._
import org.bson.types.ObjectId
import org.joda.time.DateTime
import org.joda.time.DateTimeZone.UTC
import com.mongodb.casbah.commons.conversions.scala._
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props



object Commands{
  case class GetActivities(uid: String)
  case class GetIds(activities: Iterable[DBObject])
  case class GetDataForIds(data: Map[String, List[ObjectId]])

}

class Commands extends Actor {
  def receive = {
    case Commands.GetActivities(uid) =>
      sender ! Commands.GetActivities(uid)
    case Commands.GetIds(activities) =>
      sender ! Commands.GetIds(activities)
    case Commands.GetDataForIds(data) =>
      sender ! Commands.GetDataForIds(data)
  }
}

class Activities extends Actor{

  override def preStart(): Unit = {

    val commands = context.actorOf(Props[Commands], "commands")

    commands ! Commands.GetActivities("53f76b6553544244db060000")
  }

  def receive = {
    case Commands.GetActivities(uid) => {
      println(get(uid))
      println("get activities")
      println("------------")
      sender ! Commands.getIds(get(uid))
    }
  }
  def get(userId: String): Iterable[DBObject] ={}
}

class Ids() extends Actor{
  def receive = {
    case Commands.GetIds(activities) => {
      println(getIds(activities))
      println("get ids")
      println("------------")
      sender ! Commands.GetDataForIds(getIds(activities))
    }
  }
  def getIds(activities: Iterable[DBObject]): Map[String, List[ObjectId]] =
}

class DataForIds() extends Actor{
  def receive = {
    case Commands.GetDataForIds(activities) => println(getDataForIds(activities))
  }

  def getDataForIds(data: Map[String, List[ObjectId]]): Map[String, Any] = {}

object Driver {

  def main{
    val system = ActorSystem("Main")
    val ac = system.actorOf(Props[Activities])
  }

}

When i compile and run Driver.main - i get only

println(get(uid))
println("get activities")
println("------------")

And process looks like freeze didnt END without CTRL+C

But i want in Activities in case Commands.GetActivities(uid) after running function get(uid) start actor Ids - what i do wrong? Concept is Ids.getIds( Activities.get(uid) )

HUGE thanks to @Sarvesh-Kumar-Singh, and that the answer

class Commands extends Actor {
  def receive = {
    case Commands.GetActivities(uid) =>
      sender ! Commands.GetActivities(uid)
    case Commands.GetIds(activities) =>
      val ids = context.actorOf(Props[Ids], "ids")
      ids ! Commands.GetIds(activities)
    case Commands.GetDataForIds(data) =>
      val dataforids = context.actorOf(Props[DataForIds], "daraforids")
      dataforids ! Commands.GetDataForIds(data)
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM