在学习Akka时,自然会接触到scala语言,对于用惯了java的程序员来说,使用JAVA的Future的特性更为熟练。所以有了本篇文章。
本节主要讨论feature在这两种语言中的转换与使用。
<dependency>
<groupId>org.scala-lang.modules</groupId>
<artifactId>scala-java8-compat_2.11</artifactId>
<version>0.8.0</version>
</dependency>
为实现转换,要用到上面的依赖,具体使用对比下面的示例。
import static scala.compat.java8.FutureConverters.toJava;
@Test
public void testGreeterActorSendingOfGreeting3() throws InterruptedException {
CountDownLatch latch=new CountDownLatch(1);
final TestKit testProbe = new TestKit(system);
final ActorRef helloGreeter = system.actorOf(Greeter.props("Hello", testProbe.getRef()));
helloGreeter.tell(new Greeter.WhoToGreet("Akka"), ActorRef.noSender());
Future<Object> ask = ask(helloGreeter, new Greeter.Greet(), 2000);
//scala
ask.onComplete(o->{
Printer.Greeting greeting = testProbe.expectMsgClass(Printer.Greeting.class);
assertEquals("Hello, Akka", o);
return null;
},system.dispatcher());
latch.await();
}
@Test
public void testGreeterActorSendingOfGreeting4() throws InterruptedException {
CountDownLatch latch=new CountDownLatch(1);
final TestKit testProbe = new TestKit(system);
ActorRef printActor = system.actorOf(Printer.props());
final ActorRef helloGreeter = system.actorOf(Greeter.props("Hello", printActor));
helloGreeter.tell(new Greeter.WhoToGreet("Akka"), ActorRef.noSender());
Future<Object> ask = ask(helloGreeter, new Greeter.Greet(), 1000);
//java
CompletionStage<Object> future = toJava(ask);
future.thenAccept(r->{
System.out.println("result:"+r);
});
latch.await();
}
toJava(ask);
future.thenAccept(r->{
System.out.println("result:"+r);
});
latch.await();
}
//scala
ask.onComplete(new OnComplete<Object>() {
@Override
public void onComplete(Throwable throwable, Object o) throws Throwable {
}
}, system.dispatcher());