Future被Akka设计用来处理并发执行结果的数据结构,我们可以通过同步(阻塞)或异步(非阻塞)的方法接受结果。使用Future,我们可以在Actor外部获取某个Actor的消息,在介绍Actor消息发送方式时,我们进行过简单介绍,现在我们先来回忆一下Future的常规用法。
Future消息处理
ask发送消息会返回一个Future对象,通过该对象我们可以同步或异步方式处理Actor返回的结果消息。同步方式主要依赖Await类的方法阻塞等待返回值,异步方式则依靠Future对象提供的诸多回调方法。使用ask方法时,我们最好设置一个超时时间,否则一直阻塞严重影响系统的吞吐率和性能。
同步方式代码示例:
public class FutureActor extends AbstractActor {
public static void main(String[] args) {
ActorSystem system = ActorSystem.create("system");
ActorRef futureActor = system.actorOf(Props.create(FutureActor.class), "futureActor");
Timeout timeout = new Timeout(Duration.create(2, TimeUnit.SECONDS));
Future<Object> future = Patterns.ask(futureActor, "wait access message", timeout);
try {
String reply = (String) Await.result(future, timeout.duration());
System.out.println("回复的消息: " + reply);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public Receive createReceive() {
return receiveBuilder().matchAny(other -> {
System.out.println("接受的消息:" + other);
//模拟超时操作
// Thread.sleep(3000);
getSender().tell("access", getSelf());
}).build();
}
}
我们首先定义Timeout用于限制超时,然后使用Patterns.ask给futureActor发送异步请求,返回一个Future对象,该对象封装了futureActor返回的消息,之前我们说过处理消息有两种方式:同步和异步,代码中采用Await.result(同步方式),表明我们