起初我只想说我是akka和Futures的新手。所以要温柔:)。
我在某个类中有init方法返回ListenableFuture<Boolean>
。这个方法应该在单独的线程中执行一些耗时的代码,并创建一个正在监听akka集群中的一些消息的akka actor。 init方法返回的future应该在此actor接收到某些消息并且耗尽代码完成后完成。
如何使用Guava的ListenableFuture实现这一目标?
答案 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()
被调用,未来已完成并返回值。