处理Akka应用程序中的每个事件

akka徽标 这里的事件,那里的事件,到处都是事件。 发布有关检查每一项Akka事件最终都能找到归宿的信息。

Akka和基于事件的反应式应用程序是创建软件的新方法。 在当前基于Scala的项目中,我们非常密集地使用Akka。 事件非常适合我们的用例,因为我们正在与外部API通信,这可能很慢。 使用传统的同步方法处理时,这可能会损害用户体验。 但是幸运的是,我们的请求可以异步执行,因此将它们传递给Actor似乎是一个好主意。

当事情得到控制时

但是,事件虽然很酷并且非常有用,但是如果没有经验的人来处理,事件仍然会伤害项目。 异步性质使应用程序流程乍一看很难理解。 而且,每当您向系统中添加新的参与者或事件类型时,您忘记正确处理某件事的可能性就会增加。

让我们看一下示例类,这是一个处理与Image标签和注释关联的事件的actor:

class YourActor extends Actor {override def receive = {case event: ImageTagged =>doSomething()case event: OtherImageTaggedByFriend =>doSomething2()case event: MostMotedUserImage =>doSomething3()case event: MostCommentedFriendImageChosen =>doSomething4()}
}

当您添加下一个事件时,例如说MostLikedFriendImage,您可以轻松地忘记在actor中添加处理程序案例部分,尤其是当有多个actor监听此类事件时。

干违规溶液

有一种简单的解决方案可以检测遗忘的处理程序。 我们可以将case _添加到每个actor:

class YourActor extends Actor {override def receive = {case event: ImageTagged =>doSomething()case event: OtherImageTaggedByFriend =>doSomething2()case event: MostMotedUserImage =>doSomething3()case event: MostCommentedFriendImageChosen =>doSomething4()case event: _ :logger.error("Received unknown event " + event.getClass.toString)}
}

虽然对于一个或两个参与者来说看起来还可以,但将相同的代码片段添加到多个参与者中却很麻烦,并且违反了DRY原则。 但是,最危险的是,您团队中的某个人可能会忘记添加它(就像有人说的那样: “每个可以被遗忘的手动任务都会被遗忘” )。 那么也许我们应该寻求更好的解决方案?

对任何未处理的事件做出反应

事件不得处理

幸运的是,我们不会停留在容易出错的方法上。 当actor无法处理传递给他的事件时,将引发UnhandledMessage并将其发布到ActorSystem的EventStream。

因此,要处理每个被遗忘的事件,我们可以创建侦听器并将其订阅到EventStream:

class UnhandledMessageListener extends Actor {val logger = LoggerFactory.getLogger(getClass)override def receive = {case message: UnhandledMessage =>logger.error(s"CRITICAL! No actors found for message ${message.getMessage}"))if (!Environment.isProduction) {// Fail fast, fail LOUDlogger.error("Shutting application down")System.exit(-1)}}
}

并订阅代码片段:

val actorSystem = ActorSystem.create("projectActorSystem")val listener = actorSystem.actorOf(Props(new UnhandledMessageListener()))actorSystem.eventStream.subscribe(listener, classOf[UnhandledMessage])

就是这样。 现在,每当有一个参与者没有处理的事件时,我们都会知道这一点,尤其是在非生产环境中部署应用程序时!

翻译自: https://www.javacodegeeks.com/2014/06/handle-every-event-in-your-akka-application.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js设置select列表中特定项为选中状态

设置select中text"paraText"的第一个Item为选中 function jsSelectItemByValue(objSelect,objItemText) { //判断是否存在 var isExit false; for(var i0;i<objSelect.options.length;i) { if(objSelect.options[i].text objItemText) { objSelect.options[i].s…

vue 导出html

vue的html代码 <template> <div class"contentsss" ref"test"> <button click"export2Excel">导出</button> </div> </template>methods方法 export2Excel() { var a document.createElement("a"…

js快排

快排的思路&#xff1a;选定一个基准数&#xff0c;要使得基数的左边的数字全部小于它&#xff0c;右边的数字全部大于它。分别设i和j从左右开始寻找&#xff0c;从左边找到第一个比基数大的数&#xff0c;从右边找到第一个比基数小的数&#xff0c;然后交换这两个数。 当i和j…

jzoj 6302. 提高组

Description 详见OJ Solution 对于\(limit1,2\)就是使序列\(1~n\)的排列。 对于\(limit3\)&#xff0c;我们可以将其看做是两个最长上升子序列正好覆盖整个序列&#xff0c;证明显然。 我们可以做一个前缀\(max\)序列。这样对于\(max[i]\)&#xff0c;保证\(max[i]>i\)。 而…

使用IntelliJ ..达2周,到目前为止一切正常

几乎已经过去了2个星期&#xff0c;我已经完全切换到IntelliJ作为我在家里和工作中的主要Java IDE。 到目前为止一切顺利&#xff0c;这是我的初步发现。 迁移 &#xff1a;我花了几个小时来迁移项目。 最终&#xff0c;如果您的项目已经Mavenized&#xff0c;事情就简单了&am…

WEB框架研究笔记一(准备)

DELPHI框架基本完成之后&#xff0c;开发一个WEB框架的想法越来越强烈&#xff0c;一直以来没有过完整的开发过一个WEB项目&#xff0c;这几年来&#xff0c;也就看过几个WEB的产品&#xff0c;了解了一下Struts&#xff0c;去年研究了一下DORADO&#xff0c;顺便了解了SpringH…

备份文件夹

用到的API和数据结构&#xff1a; WINDOWS数据结构&#xff1a; WIN32_FIND_DATA WINDOWS API&#xff1a; FindFirstFile FindNextFile CompareFileTime CopyFIle DeleteFile View Code #include <windows.h> #include <iostream> #include <string> using…

面试整理(1):原生ajax

接到电话面试&#xff0c;有一些送分题答的不好&#xff0c;在这里整理一下 问题&#xff1a;原生ajax的工作流程是怎么样的&#xff1f; 老用封装好的工具&#xff0c;原生的ajax其实并不熟悉&#xff0c;今天复习一下。主要参考http://www.w3school.com.cn/ajax/ 要发一个…

QT

Qt软件 Qt是一个跨平台的C图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 自从1996年早些时候&#xff0c;Qt进入商业领域&#xff0c;它已经成为全…

IOS获取资源路径

1. 获取已经添加到xcode工程中的某一资源文件 file.txt 的路径 NSString *filePath_ [[NSBundle mainBundle] pathForResource:"file" ofType:"txt"]; std::string filePath std::string([filePath_ UTF8String]); 2. 对当前xcode工程开通沙盒权限后&#…

我从ColdFusion迁移到Java开发

尽管我在大学和研究生的整个职业生涯中都研究和尝试了不同的开发技术和工具&#xff0c;但我的全职职业生涯始于Adobe ColdFusion的开发。 从学校毕业后&#xff0c;使用技术解决现实世界中的业务问题本身就是一个挑战。 由于其相当简单的性质&#xff0c;ColdFusion不会妨碍您…

Azure IoT Hub和Event Hub相关的技术系列-索引篇

Azure IoT Hub和Event Hub相关的技术系列&#xff0c;最近已经整理了不少了&#xff0c;统一做一个索引链接&#xff0c;置顶。 Azure IoT 技术研究系列1-入门篇 Azure IoT 技术研究系列2-设备注册到Azure IoT Hub Azure IoT 技术研究系列3-设备到云、云到设备通信 Azure IoT 技…

spiderUI窗口过小解决

复制以下代码&#xff0c;直接替换此css样式即可&#xff1a; C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\pyspider\webui\static\debug.min.css body{margin:0;padding:0;height:100%;overflow:hidden}.warning{color:#f0ad4e}.error{…

js获得页面鼠标位置

1.客户区坐标位置&#xff1a;clientX&#xff0c;clientY 鼠标相对于在当前页面可视范围左上角的位置 2.页面坐标位置&#xff1a;pageX,pageY 鼠标相对于页面左上角的位置&#xff08;受滑动等影响&#xff0c;例如pageYclientY scrollTop&#xff09; 3.屏幕坐标位置&#x…

针对新手的Java EE7和Maven项目–第7部分

从前面的部分恢复 第1 部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分 &#xff0c; 第4 部分 &#xff0c; 第5 部分 &#xff0c; 第6部分 在上一篇文章&#xff08;第6章&#xff09;中&#xff0c;我们发现了如何使用Arquillian和Wildfly 8.1进行单元测试JPA2域模型。…

【转】IP Socket知识

虽然不是每个人都要做网络工程师&#xff0c;但开发人员的日常工作中&#xff0c;没有哪个不曾接触IP&#xff0c; 我碰到过好多新手在IP上犯迷糊&#xff0c;总结一下。 IP地址的记法&#xff1a; IP地址由四个字节构成&#xff0c;为了方便阅读和书写&#xff0c;每个字节用0…

具有Akka反应流的反应队列

反应性流是最近宣布的一项计划&#xff0c;旨在在JVM上为具有内置背压的异步流处理创建标准。 该工作组由Typesafe&#xff0c;Red Hat&#xff0c;Oracle&#xff0c;Netflix等公司组成。 早期的实验性实现之一是基于Akka的 。 预览版0.3包括演员生产者和消费者&#xff0c;这…

灰盒测试—提高篇

灰盒测试是要运用一些开发知识的&#xff0c;大家都认为要去学习开发知识。网上很多论坛也有人说做测试之前&#xff0c;最好要有一、二年的开发经验就比较好。做为黑盒测试人员&#xff0c;如果会当然好&#xff0c;但是大部分黑盒测试人员是没有开发经验&#xff0c;这里我谈…

Django框架下报的版本问题

报错环境 python3.6.5&#xff0c;django2.2&#xff0c;PyMySQL0.9.3 …… django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3. 解决方法&#xff1a; Django连接MySQL时默认使用MySQLdb驱动&#xff0c;但MySQLdb不支持…

CSS选择器总结

选择器   优先级 实例ID选择器   100类选择器    10伪类选择器     10 :link :visited :focus :hover :actived :lang  UI元素状态伪类          E:enabled{}匹配所有用户界面&#xff08…