akka入门-有类型的Actor
来源:互联网 发布:如何评价杨振宁知乎 编辑:程序博客网 时间:2024/06/05 19:32
Akka 中的有类型 Actor 是 Active Objects 模式的一种实现. Smalltalk诞生之时,就已经缺省地将方法调用从同步操作发为异步派发。
有类型 Actor 由两 “部分”组成, 一个公开的接口和一个实现。对普通actor来说,你拥有一个外部API (公开接口的实例) 来将方法调用异步地委托给其实现的私有实例。
有类型Actor相对于普通Actor的优势在于有类型Actor拥有静态的契约, 你不需要定义你自己的消息, 它的劣势在于对你能做什么和不能做什么进行了一些限制,例如你不能使用 become/unbecome。
有类型Actor是使用 JDK Proxies 实现的,JDK Proxies提供了非常简单的api来拦截方法调用。
3.测试类
有类型 Actor 由两 “部分”组成, 一个公开的接口和一个实现。对普通actor来说,你拥有一个外部API (公开接口的实例) 来将方法调用异步地委托给其实现的私有实例。
有类型Actor相对于普通Actor的优势在于有类型Actor拥有静态的契约, 你不需要定义你自己的消息, 它的劣势在于对你能做什么和不能做什么进行了一些限制,例如你不能使用 become/unbecome。
有类型Actor是使用 JDK Proxies 实现的,JDK Proxies提供了非常简单的api来拦截方法调用。
1.创建接口
import scala.concurrent.Future;import akka.japi.Option;/** * @author lcq * */public interface Squarer { void squareDontCare( int i ); // 不关心的处理逻辑 fire-and-forget like ActorRef.tell Future<Integer> square(int i); // non-blocking send-request-reply like ActorRef.ask Option<Integer> squareNowPlease( int i );// blocking send-request-reply int squareNow( int i ); // blocking send-request-reply // Any other type of value -->send-request-reply}2.实现类
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import scala.concurrent.Future;import akka.dispatch.Futures;import akka.japi.Option;public class SquarerImpl implements Squarer { public static final Logger log = LoggerFactory.getLogger(SquarerImpl. class); private String name; public SquarerImpl() { this. name = "default"; } public SquarerImpl(String name) { this. name = name; } public void squareDontCare(int i) { try { for ( int j = 0; j < 3; j++) { Thread. sleep(1000); log.info("squareDontCare is call " + j ); } } catch (InterruptedException e) { e.printStackTrace(); } int sq = i * i; // Nobody cares :( } public Future<Integer> square( int i ) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return Futures. successful(Integer.valueOf (i * i )); } public Option<Integer> squareNowPlease( int i ) { return Option. some(i * i); } public int squareNow(int i) { return i * i; }}
3.测试类
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import scala.concurrent.ExecutionContext;import scala.concurrent.Future;import akka.actor.ActorSystem;import akka.actor.TypedActor;import akka.actor.TypedProps;import akka.dispatch.OnComplete;import akka.japi.Option;/** * * @author lcq * */public class System { public static final Logger log = LoggerFactory.getLogger(System.class); public static void main(String... args) throws Exception { final ActorSystem actorSystem = ActorSystem.create("actor-system"); Thread.sleep(2000); // 阻塞方式调用 Squarer mySquarer = TypedActor.get(actorSystem).typedActorOf( new TypedProps<SquarerImpl>(Squarer.class , SquarerImpl.class)); int sqNowValue = mySquarer.squareNow(5); log.info( "sqNowValue" + sqNowValue ); // 非阻塞方式调用 Future<Integer> fu = mySquarer.square(6); // ExecutionContext类似于 java.util.concurrent.Executor final ExecutionContext ec = actorSystem.dispatcher(); // Future的onComplete, onResult, 或 onTimeout 方法可以用来注册一个回调,以便在Future完成时得到通知。从而提供一种避免阻塞的方法。 fu.onComplete( new OnComplete<Integer>() { @Override public void onComplete(Throwable failure , Integer result) throws Throwable { if (failure != null) { // We got a failure, handle it here } else { log.info("square result:" + result ); } } }, ec); log.info( "22222222"); // 阻塞方式调用 Option<Integer> op = mySquarer.squareNowPlease(7); log.info( "squareNowPlease result : " + op .get()); log.info( "33333333"); // 不关心的处理,方法会在另一个线程中异步地调用 mySquarer.squareDontCare(2); log.info( "44444444"); Thread.sleep(2000); log.debug( "Actor System Shutdown Starting..." ); actorSystem.shutdown(); }}4.输出结果
20:53:31.550 [main] INFO com.center.akka.typedActors.System - sqNowValue2520:53:31.554 [main] INFO com.center.akka.typedActors.System - 2222222220:53:33.561 [actor-system-akka.actor.default-dispatcher-4] INFO com.center.akka.typedActors.System - square result:3620:53:33.562 [main] INFO com.center.akka.typedActors.System - squareNowPlease result : 4920:53:33.562 [main] INFO com.center.akka.typedActors.System - 3333333320:53:33.562 [main] INFO com.center.akka.typedActors.System - 4444444420:53:34.562 [actor-system-akka.actor.default-dispatcher-2] INFO c.c.akka.typedActors.SquarerImpl - squareDontCare is call 020:53:35.562 [actor-system-akka.actor.default-dispatcher-2] INFO c.c.akka.typedActors.SquarerImpl - squareDontCare is call 120:53:35.562 [main] DEBUG com.center.akka.typedActors.System - Actor System Shutdown Starting...20:53:36.562 [actor-system-akka.actor.default-dispatcher-2] INFO c.c.akka.typedActors.SquarerImpl - squareDontCare is call 2
0 0
- akka入门-有类型的Actor
- Akka学习笔记07--TypedActor(有类型的Actor)
- Akka学习笔记07--TypedActor(有类型的Actor)
- Akka Actor入门示例
- [akka] Actor的生命周期
- AKKA-源码-Actor的结构设计
- akka入门-调用子Actor处理消息
- Akka actor
- Scala---Akka Actor(三)Actor的持久化
- Akka学习笔记05--Actor的创建
- Akka学习笔记06--Actor的消息
- Akka学习笔记05--Actor的创建
- Akka学习笔记06--Actor的消息
- 一个超简单的akka actor例子
- Akka和actor的相生相恋
- 对于akka中,actor模型的理解。
- 【Akka】Akka中actor的生命周期与DeathWatch监控
- Akka 模仿 actor
- JSP自定义标签的使用说明
- 从FlashP2P谈谈p2p技术不容忽视的弊端
- java服务器端成长指南
- 系统分析师笔记案例综合题
- IOS-封装弹出框
- akka入门-有类型的Actor
- 5555555555555555555555555
- Lucas–Kanade算法
- poj 2771(二分图匹配)
- 线程 - 读书笔记
- OC学习:Foundation框架之常用结构体
- akka入门-定时器
- 遍历设计模式
- 简单的javascript计算器