akka getSender() потерян в будущем
У меня проблема в 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());
}
}
Возможно, я что-то пропустил в документе.
1 ответ
Это объясняется в разделе "Актеры" с большим предупреждающим знаком:
Предупреждение При использовании будущих обратных вызовов, внутри акторов вам нужно избегать закрытия ссылки на содержащийся актер, то есть не вызывать методы и не обращаться к изменяемому состоянию на вмещающем акторе из обратного вызова. Это нарушит инкапсуляцию субъекта и может привести к ошибкам синхронизации и условиям состязания, потому что обратный вызов будет запланирован одновременно с действующим субъектом. К сожалению, пока нет способа обнаружить эти незаконные доступы во время компиляции. Смотрите также: Актеры и общее изменяемое состояние
Это также объясняется здесь:
http://doc.akka.io/docs/akka/2.0.2/general/jmm.html
Когда вы закрываете "getSender()", вы действительно закрываете "this.getSender()", что означает, что вы закрываете внутреннее состояние актера, что в документах, приведенных выше, не рекомендуется.
Я добавлю это в наш FAQ.
Счастливого пути,
√