actor中!(tell)与forward的区别

! 的源码:

def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit

tell 的源码:

final def tell(msg: Any, sender: ActorRef): Unit = this.!(msg)(sender)

forward 的源码:

def forward(message: Any)(implicit context: ActorContext) = tell(message, context.sender())

通过源码,我们可以轻而易举的知道 :

!  发送的消息的发送者通过一个隐式转换,把一个ActorRef转换成sender,如果找不到ActorRef的话,那个发送者就是noSender。

forward 发送消息的发送者是当前消息的上一个发送者。

即:

A To B, B To C

如果通过!的方式发送消息,则C接收到的消息的发送者是B.

如果通过 forward 的方式发送消息,则C接收到的消息的发送者是A.

如果希望 !的方式发送消息的同时携带发送者消息,则可以使用  .!(msg)(sender)

如果希望关掉actor,直接shutdown或者使用父亲actor的stop,在actor内部还可以使用context.stop(self)

时间: 2024-10-08 01:34:26

actor中!(tell)与forward的区别的相关文章

java 中sendredirect()和forward()方法的区别

 一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重定向,forward实现的是请求转发. 在web服务器内部的处理机制也是不一样的. 1. 跳转方式 运用forward方法只能重定向到同一个Web应用程序中的一个资源.而sendRedirect方法可以让你重定向到任何URL. 表单form的action= "/uu ";sendRedir

图解sendRedirect,include,forward的区别

原文:http://blog.csdn.net/java2000_net/article/details/3002763 一.sendRedirect 使用方式: servlet和jsp里面一样 response.sendRedirect(); 说明: 服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求指定的地址,一般来说,你会把需要的参数放在转发的地址里面. 注意:使用request.setAttribute的内容,不能读取了,你可以用session代替,或者用include,forward

forward && redirect 区别介绍

解释一 一句话,转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容器内部完成请求处理和转发动作---->将目标资源发送给客户:在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request.在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的.转发行为是浏览器只

Unity3d vector3.forward和transform.forward的区别!

原文连接: http://blog.csdn.net/kaluluosi111/article/details/17206655 在unity3d中有2个forward,一个是vector3.forward和transform.forward,这两个forward其实完全不一样.他们之间的区别主要体现在在不同坐标系时的反映上. 我们分别对比一下 vector3和transform两个向量的forward 在 self自身坐标系 和 world世界坐标系 中的表现,我们用transform.tra

HttpServletRequest中getAttribute()和getParameter()的区别

HttpServletRequest中getAttribute()和getParameter()的区别 1.获取的来源不同 HttpServletRequest类有setAttribute()方法,而 没有setParameter()方法 get/setParameter是在对你的页面中的表单元素进行操作,获取的是这个表单元素中的值,是某个表单提交过去的数据 比如常见的获取POST/GET传递的参数值.还有通过URL传递参数,这种方法应该用的多是http://a.jsp?id=123中的123

SERVLET API中转发与重定向的区别?

SERVLET API中转发与重定向的区别? 1.转发(forward方法) 转发仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址. 转发是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址. 2.重定向(sendRedirect方法) 重定向是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接.这样,从浏览器的地址栏中可以看到跳转后的链

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

lua中的pairs和ipairs区别

pairs Returns three values: the next function, the table t, and nil, so that the construction for k,v in pairs(t) do body end will iterate over all key–value pairs of table t. See function next for the caveats of modifying the table during its traver

浅谈HTTP中Get与Post的区别_转

可参考:HTTP请求中POST与GET的区别 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作.到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息. 1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的

python类中super()和__init__()的区别

本文和大家分享的主要是python开发中super()和__init__()的区别,希望通过本文的分享,对初学者学习这部分内容有所帮助. 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'creat A ', Base.__init__(self) class chi