如何通过 akka 消息转发谓词参数
How to foward predicate parameters over akka messages
我需要帮助转发 Akka 消息中的谓词参数。我在 Master
中调用案例 class 时创建谓词。我需要将此参数转发给 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 -> Table
的映射。 fetch
是 Table
上的一个函数,用于查找 cName
满足谓词 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))
通过创建 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))
}
很想知道是否有任何其他方法可以解决这个问题。
我需要帮助转发 Akka 消息中的谓词参数。我在 Master
中调用案例 class 时创建谓词。我需要将此参数转发给 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 -> Table
的映射。 fetch
是 Table
上的一个函数,用于查找 cName
满足谓词 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))
通过创建 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))
}
很想知道是否有任何其他方法可以解决这个问题。