Scala 如何在演员之间或演员与未来之间传递信息?
来自程序主方法的future向其参与者发送消息,请求一个iterable对象。然后,参与者创建另一个未来,要求远程参与者提供iterable对象(比如ArrayBuffer)。在从远程参与者接收到ArrayBuffer之后,参与者将如何在main方法中将其发送回第一个未来?似乎创建Scala 如何在演员之间或演员与未来之间传递信息?,scala,akka,Scala,Akka,来自程序主方法的future向其参与者发送消息,请求一个iterable对象。然后,参与者创建另一个未来,要求远程参与者提供iterable对象(比如ArrayBuffer)。在从远程参与者接收到ArrayBuffer之后,参与者将如何在main方法中将其发送回第一个未来?似乎创建sender的本地别名并创建单独的case类来表示iterable并不能防止遇到死信 下面是一个示例代码: case class SequenceObject(sqnce:Seq[someArrayBuffer])
sender
的本地别名并创建单独的case类来表示iterable并不能防止遇到死信
下面是一个示例代码:
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)
}
}
远程参与者代码为:
class ServerActorClass extends Actor {
def receive = {
case a: iNeedAnArrayBufferObject => {
val closer = sender()
closer ! SequenceObject(ArrayBufferObject[information])
}
}
上述情况似乎不起作用。远程参与者和本地参与者可以通信并正确接收消息。但是,iterable对象永远不会发送回fut1。为什么呢?提前感谢。签入询问:发送和接收未来部分你能发布完整的代码吗?如果你想发送未来
到actorTry而不使用未来,你需要使用管道
模式。根据我的经验,混合期货和参与者是一种代码气味。@ViktorKlang如果不使用期货,我怎样才能将我需要的数据从clientActor返回到客户端对象?@1xQ:什么是客户端对象?