Question

A future from the main method of a program sends a msg to its actor asking for an iterable object. The actor then creates another future that asks for the iterable object (say an ArrayBuffer) from a remote actor. After receiving the ArrayBuffer from the remote actor, how would the actor send it back to the first future in the main method? It seems creating a local alias of sender and creating a separate case class to represent the iterable does not prevent dead letters from being encountered.

Here is a sample code:

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)
   }    
}

The remote actor code is:

class ServerActorClass extends Actor {
  def receive = {
    case a: iNeedAnArrayBufferObject => {
      val closer = sender()

      closer ! SequenceObject(ArrayBufferObject[information])
    }
  }

The above does not seem to work. The remote actor and the local actor can communicate and messages are received correctly. However, the iterable object is never send back to fut1. Why is that? Thanks in advance.

Was it helpful?

Solution

Check pipeTo pattern in Ask: Send-And-Receive-Future section

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top