ListenableFuture - 收到集群中的消息并执行耗时的代码后完成

时间:2017-09-23 21:11:24

标签: java akka guava future

起初我只想说我是akka和Futures的新手。所以要温柔:)。

我在某个类中有init方法返回ListenableFuture<Boolean>。这个方法应该在单独的线程中执行一些耗时的代码,并创建一个正在监听akka集群中的一些消息的akka​​ actor。 init方法返回的future应该在此actor接收到某些消息并且耗尽代码完成后完成。

如何使用Guava的ListenableFuture实现这一目标?

2 个答案:

答案 0 :(得分:1)

请参阅有关期货的Akka文档:http://doc.akka.io/docs/akka/current/java/futures.html

您可以创建2个不同的期货,一个执行耗时的代码:

Future<String> f1 = future(new Callable<String>() {
  public String call() {
    return "Hello" + "World";
  }
}, system.dispatcher());

另一个用ask发送消息给一个演员:

Timeout timeout = new Timeout(Duration.create(5, "seconds"));
Future<Object> f2 = Patterns.ask(actor, msg, timeout);

最后,您可以使用Future.sequence创建一个在未来完成时完成的单一未来。

Iterable<Future<Integer>> listOfFutureInts = source;
Future<Iterable<Integer>> futureListOfInts = sequence(listOfFutureInts, ec);

答案 1 :(得分:0)

我这样解决了。我创建了包含耗时代码的ListenableFuture。在这个furute结束时,我创建了CountDownLatch并将其(使用创建者)传递给akka actor。然后countDownLatch.await()阻止了这个可听的未来。创建具有注入锁存器的actor然后在集群中侦听某些消息。消费此消息后,我呼叫countDownLatch.countDown()。这将解锁未来,其中await()被调用,未来已完成并返回值。