【问题标题】:Akka java never close over a ActorRefAkka java 从不关闭 ActorRef
【发布时间】:2015-09-30 22:01:58
【问题描述】:

我不明白这个关于在回调中关闭actor ref 的声明。 目前我正在使用

public void onReceive(Object message) throws Exception {
        ActorRef senderActorRef = getSender(); //never close over a future
        if (message instanceof String) {
            Future<String> f =akka.dispatch.Futures.future(new Callable<String>() {
                public String call() {
                    String value= jedisWrapper.getString("name");
                    senderActorRef.tell((String) message,ActorRef.noSender());
                    return "what";
                }
            }, ex);
            f.onSuccess(new OnSuccessExtension(), ex);
        }
    }

private final class OnSuccessExtension extends OnSuccess {
        @Override
        public void onSuccess(Object arg0) throws Throwable {
            log.info("what");
        }
    }

这是正确的使用方法吗? 如何在 OnSuccess 方法中传递 Sender Actor 参考? 另外 onSuccess 和 OnComplete 之间有什么区别? 如果我想使用 onComplete 我将如何使用它?

答案:在构造函数中传递 Sender Actor Ref。另一个用户给出的答案。 OnSuccess 是 OnComplete 的一种特殊形式。 来自 Akka 文档的 OnComplete 使用情况

final ExecutionContext ec = system.dispatcher();
future.onComplete(new OnComplete<String>() {
public void onComplete(Throwable failure, String result) {
if (failure != null) {
//We got a failure, handle it here
} else {
// We got a result, do something with it
}
}
}, ec);

【问题讨论】:

  • 你这样做的方式很好。仅当您从 OnSuccess 方法中调用 getSender() 时,才会出现竞争条件。
  • 我可以在 onSuccess 方法中使用 getSelf 吗?它不会是一个竞赛条件,因为它总是会是同一个演员?
  • getSelf 是安全的,但演员可能在那时已经死亡,并且消息将最终进入死信队列。

标签: java akka future


【解决方案1】:

在构造函数中传递它:

public void onReceive(Object message) throws Exception {
    final ActorRef senderActorRef = getSender(); //never close over a future
    if (message instanceof String) {
        Future<String> f = // ...
        f.onSuccess(new OnSuccessExtension(senderActorRef), ex);
    }
}

private final class OnSuccessExtension extends OnSuccess {
    private final ActorRef senderActorRef;

    public OnSuccessExtension(ActorRef senderActorRef) {
        this.senderActorRef = senderActorRef;
    }

    @Override
    public void onSuccess(Object arg0) throws Throwable {
        log.info("what");
        // use senderActorRef
    }
}

【讨论】:

  • 使用匿名内部类而不是扩展类怎么样?我怎样才能在那里获得发件人演员参考?
  • 只要将senderActorRef 声明为final,就可以从匿名类内部访问
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
相关资源
最近更新 更多