2

我在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());
  }
}

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

4

1 回答 1

5

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

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

这里也有解释:

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

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

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

快乐哈金,

√</p>

于 2012-08-10T10:21:55.473 回答