用什么Akka Java类来实现未来的回调?

用什么Akka Java类来实现未来的回调?,java,callback,akka,Java,Callback,Akka,AkkaJava这里。我的班级: class SomeActor extends UntypedActor { // ... } class SomeMessage { // ... } // Inside onReceive method for another actor: Future<Fizz> fizzFut = Patterns.ask(someActor, someMsg, 500) fizzFut.onComplete(new FizzHandle

AkkaJava这里。我的班级:

class SomeActor extends UntypedActor {
    // ...
}

class SomeMessage {
    // ...
}

// Inside onReceive method for another actor:
Future<Fizz> fizzFut = Patterns.ask(someActor, someMsg, 500)
fizzFut.onComplete(new FizzHandler())

class FizzHandler extends akka.dispatch.OnComplete<Fizz> {
    @Override
    void onComplete(Throwable error, Fizz result) {
        if(error != null) {
            // Handle error.
        } else {
            // Handle success.
        }

        // TODO: Now how do I send a message back "inside" the
        // actor system?
    }
}
class SomeActor扩展了UntypedActor{
// ...
}
类消息{
// ...
}
//另一参与者的内部onReceive方法:
Future fizzFut=Patterns.ask(someActor,someMsg,500)
fizzFut.onComplete(新的FizzHandler())
类FizzHandler扩展了akka.dispatch.OnComplete{
@凌驾
完成时无效(可丢弃错误、起泡结果){
if(错误!=null){
//处理错误。
}否则{
//处理成功。
}
//TODO:现在我如何在“内部”发送消息
//演员制?
}
}
在运行时,我得到以下异常:

[ERROR] [08/23/2015 05:55:09.490] [myapp-akka.actor.default-dispatcher-4]
[akka://myapp/user/AnotherActor] No signature of method: 
scala.concurrent.impl.Promise$DefaultPromise.onComplete() is applicable for argument
types: (com.me.myapp.FizzHandler) values: [<function1>]
Possible solutions: onComplete(scala.Function1, scala.concurrent.ExecutionContext),
isCompleted(), complete(scala.util.Try), tryComplete(scala.util.Try)
[ERROR][08/23/2015 05:55:09.490][myapp-akka.actor.default-dispatcher-4]
[akka://myapp/user/AnotherActor]无方法签名:
scala.concurrent.impl.Promise$DefaultPromise.onComplete()适用于参数
类型:(com.me.myapp.FizzHandler)值:[]
可能的解决方案:onComplete(scala.Function1、scala.concurrent.ExecutionContext),
isCompleted(),complete(scala.util.Try),tryComplete(scala.util.Try)
因此,我尝试实现一个
scala.Function
子类,但显然该类是
final
,无法扩展

因此,这里有两个问题:

  • 我无法解释我的
    onComplete
    处理程序应该使用哪些Java API类。有什么想法吗?;及
  • 一旦我开始工作,并且运行了
    FizzHandler#onComplete(…)
    方法,我如何“在”我的actor系统内部”发送消息?
    收件箱
使用Akka 2.3.8和scala 2.10:

我使用单独的
onFailure
onSuccess
方法,分别采用
akka.dispatch.onFailure
akka.dispatch.onSuccess
。例如:

future.onFailure(new OnFailure() {
    @Override
    public void onFailure(Throwable failure) throws Throwable {
        // handle failure
    }
}, context().dispatcher());

future.onSuccess(新的onSuccess(){
@凌驾
public void onSuccess(对象结果)抛出可丢弃{
//处理成功的值返回
}
},context().dispatcher());

(如果您在演员之外调用此函数,则必须更改获取调度程序的位置)

在使用onComplete的示例中,您缺少调度程序。onComplete有两个参数—处理程序函数和调度程序,一旦准备就绪,应使用它们来运行回调。因此,固定样本为:

    import akka.actor.ActorSystem;
    import akka.dispatch.Futures;
    import akka.dispatch.OnComplete;
    import scala.concurrent.Future;
    import scala.runtime.BoxedUnit;

    final ActorSystem sys = ActorSystem.create();

    final Future<String> successful = Futures.successful("");
    successful.onComplete(new OnComplete<String>() {
        @Override
        public void onComplete(Throwable failure, String success) throws Throwable {

        }
    }, sys.dispatcher());
导入akka.actor.actor系统;
进口akka.dispatch.Futures;
导入akka.dispatch.OnComplete;
导入scala.concurrent.Future;
导入scala.runtime.BoxedUnit;
最终ActorSystem sys=ActorSystem.create();
最终期货成功=期货。成功(“”);
successful.onComplete(新的onComplete(){
@凌驾
public void onComplete(Throwable失败,字符串成功)抛出Throwable{
}
},sys.dispatcher());

请注意,一旦Scala 2.12稳定发布,Akka使用它进行编译(很快),它将以与Java lambda表达式兼容的方式发出
FunctionN
类,然后您就可以编写
onComplete(d->{},dispatcher)

谢谢@Chris Mowforth(+1)-关于
onFailure
处理程序的快速问题:当
someActor
(即被“询问”的参与者)抛出异常时,谁会得到通知?
onFailure
处理程序是
someActor
的父级,或者两者都是?@smeeb通过监控策略来访问actor的父级,任何线程最终都会执行
onFailure
回调方法[如果我错了,请有人纠正我!”。当目标(“被询问”)actor抛出actor supervision()时,都会收到通知。它不会自动对“询问未来”做任何事情,因此未来最终会超时。这是为了允许恢复周围的各种模式。关于ask的文档中有一个关于这些语义的大警告,请阅读以了解更多信息:
    import akka.actor.ActorSystem;
    import akka.dispatch.Futures;
    import akka.dispatch.OnComplete;
    import scala.concurrent.Future;
    import scala.runtime.BoxedUnit;

    final ActorSystem sys = ActorSystem.create();

    final Future<String> successful = Futures.successful("");
    successful.onComplete(new OnComplete<String>() {
        @Override
        public void onComplete(Throwable failure, String success) throws Throwable {

        }
    }, sys.dispatcher());