1. 程式人生 > >java中的Actor模式 Akka例項

java中的Actor模式 Akka例項

感覺Actor模式和麵向物件都把現實世界抽象成一個很簡單的模式。都是很牛逼的一種哲學思想

簡單的說,

面向物件是把所有的東西都抽象成物件。

Actor是吧所有的訊息傳遞抽象成一種抽象的模式。

下面看看java中是如何實現Actor模式的

以下就是一個非常簡單的Akka例子:

package com.yonder.akka.test;

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

/**
 * @author cyd
 * @date 2015-3-24
 */
public class ActorSystemTools {

	private static ActorSystem actorSystem = null;
	
	public static void start() {
		System.out.println("start actorSystem...");
		actorSystem = ActorSystem.create();
	}
	
	@SuppressWarnings("unchecked")
	public static ActorRef actorOf(Class clazz) {
		return actorSystem.actorOf(Props.create(clazz));
	}
	
	public static void shutdown() {
		System.out.println("shutdown actorSystem...");
		actorSystem.shutdown();
	}
}


package com.yonder.akka.test;

import akka.actor.UntypedActor;

/**
 * @author cyd
 * @date 2015-3-24
 */
public class AngryFoalActor extends UntypedActor {

	public void onReceive(Object message) throws Exception {
		System.out.println("AngryFoalActor receive message : " + message);
		getSender().tell("hello! I am  AngryFoalActor!", getSelf());
	}
}
package com.yonder.akka.test;

import akka.actor.UntypedActor;

/**
 * @author cyd
 * @date 2015-3-24
 */

public class LazyFoalActor extends UntypedActor {

	@Override
	public void onReceive(Object message) throws Exception {
		System.out.println("LazyFoalActor receive message : " + message);
	}
}
package com.yonder.akka.test;

import akka.actor.ActorRef;

/**
 * @author cyd
 * @date 2015-3-25
 */
public class Main {
	
	public static void main(String[] args) {
		ActorSystemTools.start();
		ActorRef angryFoal = ActorSystemTools.actorOf(AngryFoalActor.class);
		ActorRef lazyFoal = ActorSystemTools.actorOf(LazyFoalActor.class);
		angryFoal.tell("hello! I am  LazyFoalActor!", lazyFoal);
	}

}


執行結果:

start actorSystem...
AngryFoalActor receive message : hello! I am  LazyFoalActor!
LazyFoalActor receive message : hello! I am  AngryFoalActor!


上述的例子中,

ActorSystemTools是作為Actor系統的管理類,負責Actor系統的初始化、Actor物件建立、系統的關閉

angryFoal(AngryFoalActor)、lazyFoal(LazyFoalActor)是兩個Actor物件(也就是Actor模型中訊息的傳送、接受者)

Main就是整個例子的入口

例子中系統啟動後傳送一個訊息 "hello! I am  LazyFoalActor!" 給angryFoal,訊息傳送者是lazyFoal。

angryFoal在接收到訊息後,給訊息的傳送者傳送回覆訊息 "hello! I am  AngryFoalActor!"


這樣就是一個Actor訊息模型的簡單例子。當然Actor模型不僅僅能處理這種簡單的訊息傳遞,採用Actor來處理一些需要併發的業務邏輯也可以使一些原本需要手動來新增同步鎖的複雜邏輯變得更加簡單。Actor訊息還支援跨伺服器的傳送,這樣就可以用Actor來進行網路通訊。具體的使用方式將在後續的文章中與大家分享探討。

akka相關的可能需要引用到的jar包:

scala-library-2.11.1.jar

akka-actor_2.11-2.3.4.jar

akka-remote_2.11-2.3.4.jar

akka-slf4j_2.11-2.3.4.jar

可以到http://www.java2s.com/Code/Jar/a/akka.htm上查詢下載相關的jar包