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.

Счастливого пути,

Другие вопросы по тегам