統合Akka
10832 ワード
Integrating with Akka
Akkaは、Actorモデルを使用して抽象レベルを向上させ、適切な同時および拡張可能なアプリケーションを構築するためのより良いプラットフォームを提供します.フォールトトレランスにはLet it crash
モデルを採用し,これは電気通信業界で永遠に停止しない自己治癒システムを構築するのに成功した応用である.Actorはtransparent distributionと基本的な本当に拡張可能でフォールトトレランスの応用を提供した.
The application actor system
Akkaはactor systemsと呼ばれるいくつかの容器を使用することができます.1つのactor systemは、その構成リソースを管理して、彼が含むactorsを実行する.
1つのPlayアプリケーションは、特殊なactorシステムが自身で使用されることを定義する.このactor systemは、このアプリケーションのライフサイクルに従って自動的に再起動され、アプリケーションが再起動されると自動的に再起動されます.
Writing actors
Akkaを使うにはactorを書く必要があります次は簡単なactorです.package actors;
import akka.actor.*;
import actors.HelloActorProtocol.*;
public class HelloActor extends UntypedActor {
public static Props props = Props.create(HelloActor.class);
public void onReceive(Object msg) throws Exception {
if (msg instanceof SayHello) {
sender().tell("Hello, " + ((SayHello) msg).name, self());
}
}
}
ここでHelloActorは、props
というstatic fieldを定義し、このactorの作成方法を記述するためにProps
オブジェクトを返します.これは、actorを作成するコードからインスタンス化された論理を分離するための非常に良いAkka慣例です.
ここにbest practiceがあります.HelloActor
の送信と受信をstatic inner classesと定義することをHelloActorProtocol
と呼びます.package actors;
public class HelloActorProtocol {
public static class SayHello {
public final String name;
public SayHello(String name) {
this.name = name;
}
}
}
Creating and using actors
actor
を作成または使用するには、ActorSystem
が必要です.依存性を明らかにすることで得ることができ、actorOf
の方法で新しいactorを作成することができます.
最も基本的なことはactorにmessageを送ることですメッセージをactorに送信すると応答しませんこれもtell
モードと呼ぶ.
しかしながら、1つのウェブアプリケーションでは、HTTPプロトコルはrequestおよびresponsesであるため、tell
モードは通常は役に立たない.この場合、ask
モードが望ましいかもしれません.このask
モードはScalaのFuture
を返し、scala.compat.java8.FutureConverts.toJava
を使用してJavaのCompletionStage
に変換することができます.ask
モードを使用したHelloActor
の例を次に示します.import akka.actor.*;
import play.mvc.*;
import scala.compat.java8.FutureConverters;
import javax.inject.*;
import java.util.concurrent.CompletionStage;
import static akka.pattern.Patterns.ask;//need imported
@Singleton
public class Application extends Controller {
final ActorRef helloActor;
@Inject public Application(ActorSystem system) {
helloActor = system.actorOf(HelloActor.props);
}
public CompletionStage sayHello(String name) {
return FutureConverters.toJava(ask(helloActor, new SayHello(name), 1000))
.thenApply(response -> ok((String) response));
}
}
注意すべき点はいくつかあります.
package actors;
import akka.actor.*;
import actors.HelloActorProtocol.*;
public class HelloActor extends UntypedActor {
public static Props props = Props.create(HelloActor.class);
public void onReceive(Object msg) throws Exception {
if (msg instanceof SayHello) {
sender().tell("Hello, " + ((SayHello) msg).name, self());
}
}
}
package actors;
public class HelloActorProtocol {
public static class SayHello {
public final String name;
public SayHello(String name) {
this.name = name;
}
}
}
import akka.actor.*;
import play.mvc.*;
import scala.compat.java8.FutureConverters;
import javax.inject.*;
import java.util.concurrent.CompletionStage;
import static akka.pattern.Patterns.ask;//need imported
@Singleton
public class Application extends Controller {
final ActorRef helloActor;
@Inject public Application(ActorSystem system) {
helloActor = system.actorOf(HelloActor.props);
}
public CompletionStage sayHello(String name) {
return FutureConverters.toJava(ask(helloActor, new SayHello(name), 1000))
.thenApply(response -> ok((String) response));
}
}
ask
モードを導入する必要があり、静的導入ask
は通常最も便利な方法である.future
はCompletionStage
に変換される.これによりpromiseはCompletionStage