akka(tell,ask,send)
来源:互联网 发布:top域名续费 编辑:程序博客网 时间:2024/06/05 08:28
tell
异步发送一个消息并立即返回。
target.tell(message, getSelf());
在Actor外部,如果没有回复,第二个参数可以为null;
ask
异步发送一条消息并返回一个 Future代表一个可能的回应
forward转发消息
target.forward(result, getContext());
注意:
使用ask会造成性能影响,因为当超时是,一些事情需要保持追踪。这需要一些东西来将一个Promise连接进入ActorRef,并且需要通过远程连接可到达的。所以总是使用tell更偏向性能,除非必须才用ask。
如果在角色外部需要一个回复,你可以使用ASK模式描
ask 模式既包含actor也包含future, 所以它是作为一种使用模式,而不是ActorRef的方法:
ask和future上的pipe模式一起使用是一个常用的组合,
final Timeout t = new Timeout(Duration.create(5, TimeUnit.SECONDS));final ArrayList<Future<Object>> futures = new ArrayList<Future<Object>>();futures.add(ask(actorA, "request", 1000)); futures.add(ask(actorB, "another request", t)); final Future<Iterable<Object>> aggregate = Futures.sequence(futures, system.dispatcher());final Future<Result> transformed = aggregate.map( new Mapper<Iterable<Object>, Result>() { public Result apply(Iterable<Object> coll) { final Iterator<Object> it = coll.iterator(); final String x = (String) it.next(); final String s = (String) it.next(); return new Result(x, s); } }, system.dispatcher());pipe(transformed, system.dispatcher()).to(actorC);
ask 产生 Future, 两个通过Futures.sequence和map方法组合成一个新的Future,然后用 pipe 在future上安装一个 onComplete-处理器来完成将收集到的 Result 发送到其它actor的动作。使用 ask 将会像tell 一样发送消息给接收方, 接收方必须通过getSender().tell(reply, getSelf()) 发送回应来为返回的 Future 填充数据。ask 操作包括创建一个内部actor来处理回应,必须为这个内部actor指定一个超时期限,过了超时期限内部actor将被销毁以防止内存泄露。
如果一个actor 没有完成future , 它会在超时时限到来时过期, 明确作为一个参数传给ask方法,以 AskTimeoutException来完成Future。
try { String result = operation(); getSender().tell(result, getSelf());} catch (Exception e) { getSender().tell(new akka.actor.Status.Failure(e), getSelf()); throw e;}
Future的onComplete, onResult, 或 onTimeout 方法可以用来注册一个回调,以便在Future完成时得到通知。从而提供一种避免阻塞的方法。
使用future回调时,在角色内部要避免使用关闭该角色的引用(不要在回调中调用该角色的方法或访问其可变状态)这会破坏角色的封装,会引用同步bug和race condition, 因为回调会与此角色一同被并发调度。 目前还没有一种编译时的方法能够探测到这种非法访问。
- akka(tell,ask,send)
- Tell, Don't Ask
- Tell,Don’t Ask!
- Don’t Ask, Tell
- Tell Don't Ask and Mock Objects(转载)
- Scala---Akka Actor(二)actor创建以及Ask模式
- akka的ask消息发送
- 命令,不要去询问(Tell, Don’t Ask)
- 命令,不要去询问(Tell, Don’t Ask)”原则
- Tell Above, and Ask Below - Hybridizing OO and Functional Design
- Tell Above, and Ask Below - Hybridizing OO and Functional Design
- ask
- Ask
- tell ........
- Akka历史和亮点(Akka 2)
- Akka 实践(一)Akka基础
- Akka 实践(一)Akka基础
- Akka(28): Http:About Akka-Http
- Windows netstat 查看端口、进程占用
- Android ViewGroup和View的传递事件
- MySQL binlog手动和自动清除
- 【python网络编程】TCP套接字
- tar命令(转自http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html)
- akka(tell,ask,send)
- iOS开发系列--C语言之预处理
- CentOS 下面解决libvirt版本过低、升级冲突问题
- 动态规划_DAG例题_The Tower of Babylon(UVA437)
- VS2012 + Qt5 配置 Meshlab1.3.3 步骤
- itoa函数的运用
- 高性能、高流量Java Web站点打造的22条建议
- [Android] animated-rotate简单的转菊花...
- Log4net按照不同级别写入多个日志文件