2012-08-10 91 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 2012-08-10 09:26:11

回答

4

它在演員解釋說,有一個很大的警示標誌的文檔的部分:

警告使用未來的回調,則需要 小心避免關閉在包含演員的參考,即裏面做演員 不會在回調中調用 附屬actor上的方法或訪問可變狀態。這將打破actor封裝,並可能會引入同步錯誤和競爭條件,因爲 回調將同時安排給封閉actor。 不幸的是,在編譯時還沒有辦法檢測到這些非法訪問 。另見:演員和共享可變狀態

它也解釋了這裏:

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

當您關閉了 「getSender()」 你真的關閉了「this.getSender() 「,這意味着你正在關閉演員的內部狀態,上面的文檔告訴你不要這樣做。

我會將其添加到我們的常見問題。

快樂hAkking,

+0

我的錯誤,謝謝Viktor :) – 2012-08-20 02:18:31