Akka for Java Developer(パート1)

最近、JVMを実行用のプラットフォームとして使用するかなり多くのプログラミング言語が登場しました。 最近議論する最もホットなトピックの1つはScalaです。 この記事では、それを十分に検討するに値するものではありません。Javaを使用し、Scalaで1行も記述せずに、この言語のツールをどのように使用できるかを伝えたいだけです。



アクターの概念はScalaよりもずっと前に生まれ、Javaを含むさまざまなプログラミング言語で実装されました。 簡単に言えば、アクターは送信されたメッセージを処理するオブジェクトです。 メッセージは不変であり、処理の順序は受信した順序に対応することが重要です。 実際、これがコンセプトの基礎であり、実装機能が登場します:オブジェクトのメッセージキューが保存されるか、プロセス内のメッセージ処理コードを変更できるか、アクターがスレッドまたはスレッドプールにバインドされるか、他のマシンのアクターにメッセージを送信するか、など



一般に、JEEに精通している人がいる場合、アクターはMessage Beanに非常に似ており、メッセージキューのみがJVM内に存在します。

Scala言語の作成者は、Scala言語のアクターの概念を実装することを決定し、Akkaという名前を付け、このプロジェクトを商用オープンソースプロジェクトとして開発しています。 このプロジェクトは非常に活発に開発されており、現在のバージョン1.1.3および作業はバージョン2.0で進行中であり、秋にリリースされる予定です。 分散キューのサポートとクラスターのより良い編成があります。



なぜAkkaを選んだのですか? まず、分散コンピューティングと高負荷システムの複雑さに対処する新しい方法を感じたかった。 2番目の非常に重要なのはドキュメントです。 現在、アクターについてアクティブになっているJetLangとAkkaのプロジェクトは2つだけであり、AkkaはJavaとScalaの両方の詳細なドキュメント、コード例、および場所と理由の詳細な説明に魅了されています。 実際、3番目の理由は、テクノロジーを使用する利点を得るために新しい言語を習得する必要がないことです。



それでは始めましょう。



Akkaを使用して何かを作成するには、 akka.io / downloads配布キットをダウンロードするか、次のライブラリをmavenに接続する必要があります。



< repository > <br> < id > akka.repository </ id > <br> < name > Akka Maven Repository </ name > <br> < url > akka.io/repository </ url > <br> </ repository > <br><br> < dependency > <br> < groupId > se.scalablesolutions.akka </ groupId > <br> < artifactId > akka-actor </ artifactId > <br> < version > 1.1.3 </ version > <br> </ dependency > <br><br> < dependency > <br> < groupId > se.scalablesolutions.akka </ groupId > <br> < artifactId > akka-typed-actor </ artifactId > <br> < version > 1.1.3 </ version > <br> </ dependency > <br><br> * This source code was highlighted with Source Code Highlighter .







Akkaは、UntypedActorとTypedActorの2種類のアクターを実装しています。 UntypedActorは、onReceiveメソッドを介してメッセージを処理するための標準インターフェースを提供します



import akka.actor.UntypedActor;



public class TestUntypedActor extends UntypedActor {



public void onReceive(Object message) throws Exception {

if (message instanceof MySuperMessage) {

System. out .println( "We've got super message - " + message);

} else if (message instance of String) {

System. out .println( "Process string - " + message);

}

}




* This source code was highlighted with Source Code Highlighter .








このようにして、メッセージを送信することで対話できる多くのクラスを取得します。

TypedActorの場合、最初にインタラクションインターフェイスを記述してから、アクターを使用して実装する必要があります。



interface RegistrationService {

void register(User user, Credentials cred);

User getUserFor(String username);

}



import akka.actor.TypedActor;



public class RegistrationServiceImpl extends TypedActor implements RegistrationService {

public void register(User user, Credentials cred) {

... //

}



public User getUserFor(String username) {

... //

return user;

}

}




* This source code was highlighted with Source Code Highlighter .








この場合、アクターを使用したビジネスロジックと実装のインターフェイスを持つ多くのクラスがあります。 アプリケーションでSpringを使用する場合、既存のアプリケーションへのアクターの統合は構成レベルで行われ、ほとんど問題はありません(次の記事でその方法を示します)。



したがって、アクターの説明があり、単純なnewはここでは機能しないため、クラスのインスタンスを何らかの方法で作成する必要があります。 Actorsファクトリは、UntypedActorを作成するために使用されます。



ActorRef testActor = Actors.actorOf(TestUntypedActor. class );



* This source code was highlighted with Source Code Highlighter .








作成後、ファクトリはアクターの特定のインスタンスへのリンク(ActorRef)を返します。これは、シリアル化するか、別のマシンに送信して特定のインスタンスにメッセージを送信できます(リモートアクターの場合)。



次のコードを使用して、TypedActorを作成します。



// - , -

UserService service =

(UserService) TypedActor.newInstance(UserService. class , UserServiceImpl. class );



// TypedActor



UserService service = TypedActor.newInstance(UserService. class , new TypedActorFactory() {

public TypedActor create() {

return new UserServiceImpl( "default user storage" ));

});




* This source code was highlighted with Source Code Highlighter .








これは、アクターと通信するためのインターフェースへのリンクを返します。



Akkaは、アクターへの3種類のメッセージ送信を実装しています。fire-and-forget(「送信して忘れる」、結果を待たずにメッセージを非同期送信する)、request-reply(「質問-回答」、メッセージを送信して応答を待つ、同期モード) 、request-reply-with-future(「将来、応答を送信および受信する」、メッセージを送信し、特別なオブジェクトを使用してコード内でさらに応答を受信する)。



UntypedActorの場合、3つのメソッドはすべて次のようになります



actorRef.sendOneWay( "Hello" ); //



actorRef.sendOneWay( new MySuperObject(), ontext()); // . context actor' ( ), context().reply()



Object result = actorRef.sendRequestReply( "get result" ); // . context() ( ActorTimeoutException)



Future<MyResult> future = actorRef.sendRequestReplyFuture( "Hello" ); // . context() . Future await ( ), result ( ), exception ( )



* This source code was highlighted with Source Code Highlighter .








TypedActorの場合、呼び出しメソッドはメソッドシグネチャに依存します。 メソッドが値(void)を返さない場合、fire-and-forget呼び出しが暗黙的に使用されます。 オブジェクトが返される場合、request-replyが使用されます。 メソッドがFutureを返す場合、request-reply-with-futureが使用されます。



さて、今日は最後です-UntypedActorsを起動してリソースを解放することを忘れないでください。 開始していない俳優にメッセージを送信した場合、メッセージは彼の番に追加され、処理されません。 したがって、何かが機能していないことを理解することは困難です。



All Articles