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 セクションで、大きな警告サインで説明されています。

警告 フューチャー コールバックを使用する場合、アクター内で、含まれているアクターの参照を閉じないように注意する必要があります。つまり、メソッドを呼び出したり、コールバック内から囲んでいるアクターの変更可能な状態にアクセスしたりしないでください。これにより、アクターのカプセル化が壊れ、同期バグや競合状態が発生する可能性があります。これは、コールバックが含まれているアクターに対して同時にスケジュールされるためです。残念ながら、これらの不正なアクセスをコンパイル時に検出する方法はまだありません。参照: アクターと共有可変状態

ここでも説明されています:

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

「getSender()」を閉じると、実際には「this.getSender()」を閉じます。つまり、アクターの内部状態を閉じることになりますが、上記のドキュメントではそうしないように指示されています。

これを FAQ に追加します。

ハッピーハッキング、

√</p>

于 2012-08-10T10:21:55.473 に答える