Как настроить параметры предиката поверх сообщений akka - PullRequest
0 голосов
/ 06 ноября 2018

Мне нужна помощь в пересылке параметра предиката в сообщениях Akka. Я создаю предикат, когда вызываю класс case в 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 -> 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))

1 Ответ

0 голосов
/ 06 ноября 2018

Решил проблему, создав 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))
}

Хотелось бы узнать, есть ли другой способ решить эту проблему.

...