gpt4 book ai didi

java - 将 future.onComplete 与 Java 和 Akka 一起使用,并将不同的结果用作 String

转载 作者:行者123 更新时间:2023-11-30 06:16:59 26 4
gpt4 key购买 nike

我有以下问题...

我正在使用来自 Java 的 Akka 2.3.6,并希望完成以下工作:

Future<Object> future = ask(actor, new GetPOIDataMessage(tenant), Timeout.durationToTimeout(duration));
future.onSuccess(new OnComplete<NonSimpleObject>() {
public void onComplete(Throwable failure, final NonSimpleObject data) {
if (failure != null) {
deferredResult.setErrorResult("An error occured during the request");
} else {
deferredResult.setResult(data);
}
}
}, ec);

NonSimpleObject 是从 actor 发回的消息的类型。编译我的代码时出现以下错误:

error: method onSuccess in interface Future<T> cannot be applied to given types;
[error] future.onSuccess(new OnComplete<NonSimpleObject>() {
[error] ^
[error] required: PartialFunction<Object,U>,ExecutionContext
[error] found: <anonymous OnComplete< NonSimpleObject >>,ExecutionContext
[error] reason: cannot infer type-variable(s) U
[error] (argument mismatch; <anonymous OnComplete< NonSimpleObject >> cannot be converted to PartialFunction<Object,U>)
[error] where U,T are type-variables:
[error] U extends Object declared in method <U>onSuccess(PartialFunction<T,U>,ExecutionContext)
[error] T extends Object declared in interface Future`

我无法解码。似乎现在在我头上。结果,它可以很好地处理 String 。我在网络上找不到其他使用不同字符串的示例。

感谢您提供正确方向的任何指示。简

最佳答案

我认为您的问题源于尝试使用 OnComplete<NonSimpleObject>而不是 OnComplete<Object> . Future你有Future<Object> , 所以按理说你只能使用 OnComplete<Object> .我不认为你可以施放任何一个,因为这似乎对我不起作用。这是您尝试执行的操作的简化工作示例:

public class NonSimpleObject{
public final int i;
public final String s;

public NonSimpleObject(String s, int i){
this.s = s;
this.i = i;
}
}

public class SimpleActor extends UntypedActor{
public SimpleActor(){

}
public void onReceive(Object msg){
getSender().tell(new NonSimpleObject("foo", 11), getContext().self());
}
}

import scala.concurrent.Future;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import static akka.pattern.Patterns.ask;
import akka.dispatch.*;

class AskTest{

public static void main(String[] args) {
ActorSystem system = ActorSystem.create();
ActorRef ref = system.actorOf(Props.create(SimpleActor.class));
Future<Object> fut = ask(ref, "foo", 1000);
fut.onComplete(new OnComplete<Object>(){
public void onComplete(Throwable t, Object result){
System.out.println(((NonSimpleObject)result).s);
}
}, system.dispatcher());
}
}

Java 和 Scala 与 Futures 之间的互操作性似乎并不是那么好。这个例子在纯 Scala 中更容易,在 Java 中看起来有点笨拙。在 Scala 中,FuturemapTo这样您就可以为您的 Future 获取正确的类型但我没有看到任何可以在 Java 中使用的类似物。

编辑

玩了一会儿之后,我发现了一种使用 mapTo 的非常 hackish 的方式。在 Future 上获得正确的打字。你可以尝试这样的事情,但就像我说的,它在如何获得所需的 Scala ClassTag 方面有点老套。对于 mapTo :

import scala.concurrent.Future;
import scala.reflect.ClassTag$;
import scala.reflect.ClassTag;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import static akka.pattern.Patterns.ask;
import akka.dispatch.*;

class AskTest{

public static void main(String[] args) {
ActorSystem system = ActorSystem.create();
ActorRef ref = system.actorOf(Props.create(SimpleActor.class));

ClassTag<NonSimpleObject> tag = ClassTag$.MODULE$.apply(NonSimpleObject.class);
Future<NonSimpleObject> fut = ask(ref, "foo", 1000).mapTo(tag);
fut.onComplete(new OnComplete<NonSimpleObject>(){
public void onComplete(Throwable t, NonSimpleObject result){
System.out.println(result.s);
}
}, system.dispatcher());
}
}

关于java - 将 future.onComplete 与 Java 和 Akka 一起使用,并将不同的结果用作 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com