akka getSender() 将来会丢失

Gré*_*vet 2 java future akka

我在 akka (java) 中遇到了发件人引用的问题,该引用在未来一段时间后消失。这是代码:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

我可能错过了文档中的某些内容。

Vik*_*ang 5

它在文档的 Actors 部分进行了解释,并带有一个大警告标志:

警告 当使用未来的回调时,在actor 内部,您需要小心避免关闭包含actor 的引用,即不要从回调中调用方法或访问封闭actor 上的可变状态。这会破坏 actor 封装,并可能引入同步错误和竞争条件,因为回调将被并发调度到封闭的 actor。不幸的是,目前还没有办法在编译时检测这些非法​​访问。另请参阅:Actors 和共享可变状态

这里也有解释:

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

当您关闭“getSender()”时,您实际上是在关闭“this.getSender()”,这意味着您正在关闭actor的内部状态,上面的文档告诉您不要这样做。

我会将其添加到我们的常见问题解答中。

快乐的黑客,

?