akka router简单实例

参考链接:http://sunxiang0918.cn/2016/01/13/Akka-in-JAVA-2/#Router

参考链接:http://blog.csdn.net/liubenlong007/article/details/54574064

通常在分布式任务调度系统中会有这样的需求:一组actor提供相同的服务,我们在调用任务的时候只需要选择其中一个actor进行处理即可。 
其实这就是一个负载均衡或者说路由策略,akka作为一个高性能支持并发的actor模型,可以用来作为任务调度集群使用,当然负载均衡就是其本职工作了,akka提供了Router来进行消息的调度。


在真实的情况中,通常针对某一种消息,会启动很多个相同的Actor来进行处理.当然,你可以在程序中循环的启动很多个相同的Actor来实现,就如上一小结中启动100个Actor那样,但是这就牵涉到Actor任务的平衡,Actor个数的维护等等,比较的麻烦.因此,在AKKA中存在一种特殊的Actor,即Router.Akka通过Router机制,来有效的分配消息给actor来完成工作.而在AKKA中,被Router管理的actor被称作Routee.

根据项目的需求,可以使用不同的路由策略来分发一个消息到actor中.Akka附带了几个常用的路由策略,配置起就可以使用.当然,也可以自定义一个路由器.




InboxActor2


package com.eastcom.first.spark.data.akka.router;

import akka.actor.UntypedActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class InboxActor2 extends UntypedActor {

	private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);

	@Override
	public void onReceive(Object o) throws Throwable {
		if (o == MsgEnum.WORKING) {
			log.info("i am working.");
		} else if (o == MsgEnum.DONE) {
			log.info("i am done");
		} else if (o == MsgEnum.CLOSE) {
			log.info("i am close." + getContext().self().path());
			getContext().stop(getSelf());// 关闭自己
		} else {
			unhandled(o);
		}
	}

}

InboxMain2

package com.eastcom.first.spark.data.akka.router;

import java.util.concurrent.atomic.AtomicBoolean;

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

public class InboxMain2 {

	public static AtomicBoolean flag = new AtomicBoolean(true);

	public static void main(String[] args) throws InterruptedException {

		// ActorSystem system = ActorSystem.create("routerTest",
		// ConfigFactory.load("akka.config"));
		ActorSystem system = ActorSystem.create("System");
		ActorRef workerRouter = system.actorOf(Props.create(InboxActor2.class).withRouter(new RoundRobinPool(3)),
				"RouterTest");
		int i = 1;
		int workSize = 0;
		while (flag.get()) {
			workerRouter.tell(MsgEnum.WORKING, ActorRef.noSender());
			if (i % 3 == 0) {
				workerRouter.tell(MsgEnum.CLOSE, ActorRef.noSender());
				workSize++;
				if (workSize >= 3) {
					flag.set(false);
				}
			}
			Thread.sleep(1000);
			i++;
		}

		system.terminate();
	}

}

运行结果

[INFO] [08/10/2017 18:10:06.696] [System-akka.actor.default-dispatcher-4] [akka://System/user/RouterTest/$a] i am working.
[INFO] [08/10/2017 18:10:07.687] [System-akka.actor.default-dispatcher-4] [akka://System/user/RouterTest/$b] i am working.
[INFO] [08/10/2017 18:10:08.687] [System-akka.actor.default-dispatcher-4] [akka://System/user/RouterTest/$c] i am working.
[INFO] [08/10/2017 18:10:08.688] [System-akka.actor.default-dispatcher-4] [akka://System/user/RouterTest/$a] i am close.akka://System/user/RouterTest/$a
[INFO] [08/10/2017 18:10:09.699] [System-akka.actor.default-dispatcher-3] [akka://System/user/RouterTest/$b] i am working.
[INFO] [08/10/2017 18:10:10.699] [System-akka.actor.default-dispatcher-3] [akka://System/user/RouterTest/$c] i am working.
[INFO] [08/10/2017 18:10:11.699] [System-akka.actor.default-dispatcher-2] [akka://System/user/RouterTest/$c] i am close.akka://System/user/RouterTest/$c
[INFO] [08/10/2017 18:10:11.699] [System-akka.actor.default-dispatcher-3] [akka://System/user/RouterTest/$b] i am working.
[INFO] [08/10/2017 18:10:12.703] [System-akka.actor.default-dispatcher-6] [akka://System/user/RouterTest/$b] i am working.
[INFO] [08/10/2017 18:10:13.702] [System-akka.actor.default-dispatcher-3] [akka://System/user/RouterTest/$b] i am working.
[INFO] [08/10/2017 18:10:14.702] [System-akka.actor.default-dispatcher-3] [akka://System/user/RouterTest/$b] i am working.
[INFO] [08/10/2017 18:10:14.702] [System-akka.actor.default-dispatcher-3] [akka://System/user/RouterTest/$b] i am close.akka://System/user/RouterTest/$b






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值