什么 Akka Java 类 来实现 Future 回调?
What Akka Java classes to implement Future callbacks with?
阿卡 Java 这里。我的 classes:
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?
}
}
在运行时我得到以下异常:
[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)
所以我尝试实现 scala.Function
subclass 但显然 class 是 final
并且无法扩展。
这里有两个问题:
- 我无法破译我的
onComplete
处理程序应该使用什么 Java API classes。有任何想法吗?;和
- 一旦我开始工作,并且
FizzHandler#onComplete(...)
方法是 运行,我如何向 "inside" 我的 actor 系统发回消息? Inbox
?
使用 Akka 2.3.8 和 scala 2.10:
我使用 separate onFailure
和 onSuccess
方法,它们分别采用 akka.dispatch.OnFailure
和 akka.dispatch.OnSuccess<T>
。例如:
future.onFailure(new OnFailure() {
@Override
public void onFailure(Throwable failure) throws Throwable {
// handle failure
}
}, context().dispatcher());
和
future.onSuccess(new OnSuccess<Object>() {
@Override
public void onSuccess(Object result) throws Throwable {
// handle successful value return
}
}, context().dispatcher());
(如果你在演员之外调用它,你必须改变你获得调度员的位置)
在您使用 onComplete 的示例中,您缺少调度程序。 onComplete 有 2 个参数 - handler
函数和 dispatcher
应该用于 运行 回调一旦准备就绪。所以固定样本为:
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());
请注意,一旦 Scala 2.12 达到稳定版本并且 Akka 使用它进行编译(很快),它将以与 Java lambda 表达式兼容的方式发出 FunctionN
类,然后你就可以写成 onComplete(d -> {}, dispatcher)
.
阿卡 Java 这里。我的 classes:
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?
}
}
在运行时我得到以下异常:
[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)
所以我尝试实现 scala.Function
subclass 但显然 class 是 final
并且无法扩展。
这里有两个问题:
- 我无法破译我的
onComplete
处理程序应该使用什么 Java API classes。有任何想法吗?;和 - 一旦我开始工作,并且
FizzHandler#onComplete(...)
方法是 运行,我如何向 "inside" 我的 actor 系统发回消息?Inbox
?
使用 Akka 2.3.8 和 scala 2.10:
我使用 separate onFailure
和 onSuccess
方法,它们分别采用 akka.dispatch.OnFailure
和 akka.dispatch.OnSuccess<T>
。例如:
future.onFailure(new OnFailure() {
@Override
public void onFailure(Throwable failure) throws Throwable {
// handle failure
}
}, context().dispatcher());
和
future.onSuccess(new OnSuccess<Object>() {
@Override
public void onSuccess(Object result) throws Throwable {
// handle successful value return
}
}, context().dispatcher());
(如果你在演员之外调用它,你必须改变你获得调度员的位置)
在您使用 onComplete 的示例中,您缺少调度程序。 onComplete 有 2 个参数 - handler
函数和 dispatcher
应该用于 运行 回调一旦准备就绪。所以固定样本为:
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());
请注意,一旦 Scala 2.12 达到稳定版本并且 Akka 使用它进行编译(很快),它将以与 Java lambda 表达式兼容的方式发出 FunctionN
类,然后你就可以写成 onComplete(d -> {}, dispatcher)
.