2012-08-10 3 views
2

장래에 잠시 후에 사라지는 송신자의 참고로 akka (java)에 문제가 있습니다. 다음은 코드입니다.akka getSender() 향후 손실

class MyActor extends UntypedActor { 
    @Override 
    public void onReceive(Object msg){ 
    Future<Integer> future = Futures.future(new Callable<Integer>(){ 
     @Override 
     public Integer call() throws Exception { 
     System.out.println(getSender()); //works fine 
     Thread.sleep(1000); 
     System.out.println(getSender()); //show deadLetter 
     return 42; 
     } 
    },getContext().dispatcher()); 

    //do something with the future, pipe it or whatever 
    Patterns.pipe(future,getContext().dispatcher(),getSender()); 
    } 
} 

문서에서 뭔가 빠졌을 수 있습니다.

+0

√ 당신은 _disappears_ 무엇을 의미합니까? – ShiDoiSi

답변

4

그것은 배우에 설명되어 큰 경고와 함께 서명 문서의 섹션

경고 미래 콜백 신중하게 할 즉, 포함하는 배우의 참조를 통해 닫지 않도록 필요, 내부 배우를 사용하는 경우 콜백 내의 에서 메서드를 호출하거나 둘러싸는 액터에서 변경할 수있는 상태에 액세스하지 않습니다. 이렇게하면 액터 캡슐화가 중단되고 콜백이 둘러싸인 액터에 동시에 예약되기 때문에 에 동기화 버그 및 경쟁 조건이 발생할 수 있습니다. 불행히도 컴파일 타임에 이러한 불법적 인 액세스를 탐지하는 방법이 아직 없습니다. 참조 : 또한 여기에 설명

배우 공유 변경할 상태 :

http://doc.akka.io/docs/akka/2.0.2/general/jmm.html#jmm-shared-state

는 "getSender는()"당신이 정말로 this.getSender "을 통해 폐쇄하고 이상 닫을 때를() ", 이는 위의 문서에서 알지 못하는 배우의 내부 상태를 종결한다는 것을 의미합니다.

이 내용을 FAQ에 추가하겠습니다.

해피 hAkking,

+0

내 실수, 감사합니다 빅토르 :) –