首页 > 解决方案 > 如何通过akka消息转发谓词参数

问题描述

我需要帮助在 Akka 消息中转发谓词参数。我在调用案例类时创建谓词Master。我需要将此参数转发给Worker节点。这是我实现的一部分。

case class select [T: ClassTag] (name: String, cName: String, p: T => Boolean)
case class selectIn [T: ClassTag] (name: String, cName: String, p: T => Boolean)

class Master extends Actor {
    val router: ActorRef = actorOf (RoundRobinPool (4).props(props[Worker]), "router")

    def receive: Receive = {
        case select (name, cName, p) =>
            router ! Broadcast (selectIn (name, cName, p))  // error on p
    }
}

case Worker extends Actor {
    def receive: Receive = {
        case selectIn (name, cName, p) =>
            rMap(name).fetch(cName, p)  // error on p
    }
}

object MasterTest {
    val actor = ActorSystem("ActorSystem").actorOf(Props[Master], "root")

    actor ! select [Int] ("Table1", "Age", x => x < 25)
}

rMap是 的地图name -> Tablefetch是一个函数,Table用于查找cName满足 predicate的行p

我收到以下错误:

type mismatch;
found   : Nothing => Boolean
required: T => Boolean
    router ! Broadcast (selectIn (r.nextInt(randomSeed), name, cName, p))

type mismatch;
found   : Nothing => Boolean
required: T => Boolean
    sender() ! selectReply ("select _" + uc + "_" + tableMap(name), rSeq(tableMap(name)).select(cName, p))

标签: scalaakkaparameter-passingpredicate

解决方案


通过创建一个type Predicate [T] = {String, T => Boolean}.

然后将代码修改为:

case class select [T: ClassTag] (name: String, p: Predicate[T])
case class selectIn [T: ClassTag] (name: String, p: Predicate[T])

class Master extends Actor {
    val router: ActorRef = actorOf (RoundRobinPool (4).props(props[Worker]), "router")

    def receive: Receive = {
        case select (name, p) =>
            router ! Broadcast (selectIn (name, p))  // error on p
    }
}

case Worker extends Actor {
    def receive: Receive = {
        case selectIn (name, p) =>
            rMap(name).fetch(p._1, p._2)  // error on p
    }
}

object MasterTest {
    val actor = ActorSystem("ActorSystem").actorOf(Props[Master], "root")

    actor ! select [Int] ("Table1", ("Age", x => x < 25))
}

很想知道是否有其他方法可以解决这个问题。


推荐阅读