Akka关联查询和响应
Akka correlate query and response
我有一个接收消息的演员 ->
(title - 物品的标题,maxAmount - 他可以为它支付多少)
case Bid(title, maxAmount) => {
val search = ...
search ! Auction.Find(title)
}
然后此演员发送查找消息以检查给定的拍卖是否可用。如果是这样,它会收到以下消息
case Auction.Result(list) => {
for(auction <- list) {
auction ! Auction.Bid(maxAmount)
}
}
问题是这个 maxAmount 在这个案例部分不可用。我该如何解决?
第一个想到的解决方案可能是在消息之间的 actor 代码中维护 maxAmount
as 状态。这是相当危险的,因为那时你还需要找到一种方法来找出哪个 Result
属于哪个 Find
消息。我建议您将信息添加到 Find
消息中:
case class Find(bid: Bid)
以便您的 search
演员可以 return 在 Result
消息中:
case Result(maxAmount: Double, list: List[SomeResultType])
或者您可以使用演员 ask pattern:
import akka.pattern.ask
case Bid(title, maxAmount) => {
val search = ...
val res: Auction.Result = search ? Auction.Find(title)
res.list.foreach(_ ! Auction.Bid(maxAmount))
}
为了使其正常工作,您的 search
演员必须像这样回复 sender()
:
case Auction.Find(title) =>
val res: Result = find(title)
sender() ! res
我有一个接收消息的演员 -> (title - 物品的标题,maxAmount - 他可以为它支付多少)
case Bid(title, maxAmount) => {
val search = ...
search ! Auction.Find(title)
}
然后此演员发送查找消息以检查给定的拍卖是否可用。如果是这样,它会收到以下消息
case Auction.Result(list) => {
for(auction <- list) {
auction ! Auction.Bid(maxAmount)
}
}
问题是这个 maxAmount 在这个案例部分不可用。我该如何解决?
第一个想到的解决方案可能是在消息之间的 actor 代码中维护 maxAmount
as 状态。这是相当危险的,因为那时你还需要找到一种方法来找出哪个 Result
属于哪个 Find
消息。我建议您将信息添加到 Find
消息中:
case class Find(bid: Bid)
以便您的 search
演员可以 return 在 Result
消息中:
case Result(maxAmount: Double, list: List[SomeResultType])
或者您可以使用演员 ask pattern:
import akka.pattern.ask
case Bid(title, maxAmount) => {
val search = ...
val res: Auction.Result = search ? Auction.Find(title)
res.list.foreach(_ ! Auction.Bid(maxAmount))
}
为了使其正常工作,您的 search
演员必须像这样回复 sender()
:
case Auction.Find(title) =>
val res: Result = find(title)
sender() ! res