我在 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)
我可能错过了文档中的某些内容。
它在文档的 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的内部状态,上面的文档告诉您不要这样做。
我会将其添加到我们的常见问题解答中。
快乐的黑客,
?
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |