java - 将 future.onComplete 与 Java 和 Akka 结合使用,并使用不同的结果作为字符串

标签 java akka future

我有以下问题...

我正在使用 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 是从参与者发回的消息的类型。我在编译代码时遇到以下错误:

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`

我无法解码。现在似乎超出了我的理解范围。 结果与字符串一起工作得很好。我在网上找不到其他使用不同字符串作为字符串的示例。

感谢您提供正确方向的指示。一月

最佳答案

我认为您的问题源于尝试使用 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关于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 结合使用,并使用不同的结果作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422364/

相关文章:

java - 如何使用 Struts2 在 Java 中从内存中释放 ArrayList

java - 项目未出现在 Java 的新框架中

scala - 如何最好地处理Future.filter谓词不满足类型错误

java - 如何每次单击按钮时添加新的 Textview

java - maven 在编译时获取属性

java - 在 Java 中向 Actor 发送 PoisonPill

java - akka websocket with java,计算客户端数量,向客户端发送消息

java - Android 上 AKKA(最好是 2.4)的 JAR 文件(编译的 java 版本 1.6 - 不是 1.8)

exception - 未捕获的异常在线程中如何表现?

java - 在 Guava 中链接 Future 时处理异常