복붙노트

[SCALA] 미래의 내 보낸

SCALA

미래의 내 보낸

나는 메시지를 수신에, 파일에 대한 파일 시스템을 검색하고 파일의 전체 경로를 반환하는 배우가있다.

비동기를 유지하기 위해, 내가 행한 :

def receive = {
  case s:String => {

    val f = future{
      val ans = search(s)
      println("Input Request: "+s+" output:"+ans+" "+sender.path)
    }
    f.onComplete{
      case Success(x) => sender ! x
      case Failure(y) => println("Could not complete it")
    }
  } 
}

// 파일 시스템 / deadLetters하지 보낸 사람 :하지만이 akka에 메시지를 반환하는 것을 관찰했다. 문서는 말한다 :

그래서 나는 반드시 동기를 유지해야한다, 의미합니까? 다른 방법이 있습니까?

해결법

  1. ==============================

    1.당신은 "가변 상태 이상 닫기"매우 일반적인 실수를하고있다. 당신의 onComplete에 전달 폐쇄는 onComplete를가 호출 될 때, 당신이 this.sender 해당 시간에 지점에 무슨 일이 생기면에 메시지를 보내는, this.sender의 카피를 작성하지 않습니다, 당신이 만들 때 지적하지 무엇 폐쇄.

    당신은 "가변 상태 이상 닫기"매우 일반적인 실수를하고있다. 당신의 onComplete에 전달 폐쇄는 onComplete를가 호출 될 때, 당신이 this.sender 해당 시간에 지점에 무슨 일이 생기면에 메시지를 보내는, this.sender의 카피를 작성하지 않습니다, 당신이 만들 때 지적하지 무엇 폐쇄.

    당신은 this.sender의 현재 내용의 자신의 지역, 불변의 복사본을 만들어이 문제를 방지하고, 폐쇄에 그 값을 참조 할 수 있습니다 :

    val origSender = sender
    f.onComplete {
        case Successs(x) => origSender ! x
        ...
    }
    
  2. ==============================

    2.

    import akka.pattern.pipe
    

    트릭을 수행합니다. 하기:

    val reply = sender
    future {
      val ans = searchAndCache(s)
      println("Input Request: "+s+" output:"+ans+" "+reply.path)
      ans
    } pipeTo reply
    

    응답은 발신자에게 다시

  3. ==============================

    3.나는 이것이 오래 알고 있지만이를 추가 할 수있어, pipeTo 올바른 방법입니다하지만 당신은 당신의 보낸 사람을 복사 할 필요가 없습니다, 동일한 맥락에서 이미입니다. 실제로 pipeTo 당신을 위해이 작업을 수행합니다. 그것은 (그것의 인수에 전달하여) 현재 발신자 심판을 취할 것 와 (그것의 구현을 보면) 당신을 위해 미래를 해결하는 데 사용할 그냥 해:

    나는 이것이 오래 알고 있지만이를 추가 할 수있어, pipeTo 올바른 방법입니다하지만 당신은 당신의 보낸 사람을 복사 할 필요가 없습니다, 동일한 맥락에서 이미입니다. 실제로 pipeTo 당신을 위해이 작업을 수행합니다. 그것은 (그것의 인수에 전달하여) 현재 발신자 심판을 취할 것 와 (그것의 구현을 보면) 당신을 위해 미래를 해결하는 데 사용할 그냥 해:

    future {
      val ans = searchAndCache(s)
      println("Input Request: "+s+" output:"+ans+" "+reply.path)
      ans
    } pipeTo reply
    
  4. from https://stackoverflow.com/questions/16898131/sender-inside-a-future by cc-by-sa and MIT license