Finagle Future的对象,它们可以重用吗?

时间:2012-10-26 14:42:06

标签: java twitter future finagle

我是Finagle的新手。我现在正在阅读某人的代码,发现Future对象在不同的​​连接操作中被重用。我的问题是会导致Future对象多次执行(在每个连接中),还是只执行一次并存储结果以供以后连接?

示例:

Future<A> a= b
            .join(c)
            .flatMap(new SomeFunctionReturningA());

Future<Tuple2<A, B>> future1 = a.join(b);
Future<D> future2 = future1.flatMap(new SomeFunctionReturningD()); 
future2.get();

那么会被执行两次,还是只执行一次?

3 个答案:

答案 0 :(得分:5)

Future是一个值的容器,只能设置一次值! Future[T]具有不同的状态:

  • 使用类型T
  • 设置
  • 设置为例外

当您在未来map/flatMap上使用f函数A时,您将创建一个新的未来B,它将是前一个变换的结果通过函数f

请注意:

  • 如果未来A尚未“填充”,您将收到尚未填充的B
  • a中设置值A的主题也将执行f(a)并设置B
  • 中的值
  • 如果A已经“填充”,那么map / flatMap的调用者也将执行f(a),但 NOT 将重新计算A的值
  • 你也可以使用onSuccess/onFailure来注册一些代码,以便在将来获得它的价值时执行。

答案 1 :(得分:1)

我自己写了一个快速测试:

import com.twitter.util.Function;
import com.twitter.util.Future;
import java.util.Random;
import org.junit.Test;
import scala.Tuple2;

public class FinagleFutureTest {
    int counter = 0;

    @Test
    public void test(){
        Counter counter = new Counter();
        Future<Counter> one = Future.value(counter).flatMap(new IncrementFunction());
        Future<Counter> two = one.flatMap(new IncrementFunction());
        Future<Tuple2<Counter, Counter>> three = two.join(one);
        Tuple2<Counter, Counter> tuple = three.flatMap(new TupleFunction()).get();
        System.out.println("one: "+ tuple._2().count+", "+tuple._2().randomInt);
        System.out.println("two: "+ tuple._1().count+", "+tuple._1().randomInt);
    }

    static class TupleFunction extends Function<Tuple2<Counter, Counter>, Future<Tuple2<Counter, Counter>>>{

        @Override
        public Future<Tuple2<Counter, Counter>> apply(Tuple2<Counter, Counter> t1) {
            return Future.value(t1);
        }

    }

    static class IncrementFunction extends Function<Counter, Future<Counter>>{
        @Override
        public Future<Counter> apply(Counter counter) {
            counter.add();
            return Future.value(counter);
        }
    }

    static class Counter{
        public int count = 0;
        public int randomInt;
        Counter(){
            Random random = new Random();
            randomInt = random.nextInt();
        }
        public void add(){
            count++;
        }
    }
}

这是结果:

one: 2, 2009034289
two: 2, 2009034289

所以结论是Future对象只执行一次,无论它涉及多少个连接操作。

答案 2 :(得分:1)

未来对象只执行一次。

Finagle使用com.twitter.util.A Future是一个尚未提供的值的句柄。

使用Future的两种最基本的方法是:   阻止并等待计算返回   在计算最终成功或失败时注册要调用的回调 FuturePool对象使您可以在其自己的线程上放置阻塞操作。

您可以从twitter blogfingale github

更多地了解Finagle Future(未来池)