【发布时间】:2014-05-04 03:56:45
【问题描述】:
来自程序主方法的future 向它的actor 发送一个msg 请求一个可迭代对象。然后actor创建另一个future,它向远程actor请求可迭代对象(比如一个ArrayBuffer)。从远程actor接收到ArrayBuffer后,actor如何在main方法中将其发送回第一个future?似乎创建sender 的本地别名并创建一个单独的案例类来表示可迭代并不会阻止遇到dead letters。
这是一个示例代码:
case class SequenceObject(sqnce:Seq[someArrayBuffer])
//...
implicit val timeout = Timeout(10 seconds)
val fut1: Future[Any] = myActor ? iNeedAnArrayBufferObject
fut1.onSuccess {
case listOfItems: SequenceObject => {
//do sth with listofItems.sqnce
}
class myActor extends Actor {
implicit val timeout = Timeout(1 seconds)
def receive = {
case a: iNeedAnArrayBufferObject => {
val originalSender = sender
val fut: Future[Any] = (remoteActor ? a)
fut.onSuccess {
case list: SequenceObject => {
originalSender ! SequenceObject(list.sqnce)
}
}
远程actor代码是:
class ServerActorClass extends Actor {
def receive = {
case a: iNeedAnArrayBufferObject => {
val closer = sender()
closer ! SequenceObject(ArrayBufferObject[information])
}
}
上述方法似乎不起作用。远程参与者和本地参与者可以通信并正确接收消息。但是,可迭代对象永远不会发送回 fut1。这是为什么?提前致谢。
【问题讨论】:
-
你能发布完整的代码吗?
-
如果你想向actor发送
future,你需要使用pipe模式 -
尝试在没有 Futures 的情况下编写它。以我的经验,混合 Futures 和 Actors 是一种代码味道。
-
@ViktorKlang 如何在不使用 Futures 的情况下将我需要的数据从 clientActor 取回给客户端对象?
-
@1xQ:什么是客户端对象?