处理Akka应用程序中的每个事件
這里的事件,那里的事件,到處都是事件。 發(fā)布有關(guān)檢查每一項Akka事件最終都能找到歸宿的信息。
Akka和基于事件的反應(yīng)式應(yīng)用程序是創(chuàng)建軟件的新方法。 在當(dāng)前基于Scala的項目中,我們非常密集地使用Akka。 事件非常適合我們的用例,因為我們正在與外部API通信,這可能很慢。 使用傳統(tǒng)的同步方法處理時,這可能會損害用戶體驗。 但是幸運的是,我們的請求可以異步執(zhí)行,因此將它們傳遞給Actor似乎是一個好主意。
當(dāng)事情得到控制時
但是,事件雖然很酷并且非常有用,但是如果沒有經(jīng)驗的人來處理,事件仍然會傷害項目。 異步性質(zhì)使應(yīng)用程序流程乍一看很難理解。 而且,每當(dāng)您向系統(tǒng)中添加新的參與者或事件類型時,您忘記正確處理某件事的可能性就會增加。
讓我們看一下示例類,這是一個處理與Image標(biāo)簽和注釋關(guān)聯(lián)的事件的actor:
class YourActor extends Actor {override def receive = {case event: ImageTagged =>doSomething()case event: OtherImageTaggedByFriend =>doSomething2()case event: MostMotedUserImage =>doSomething3()case event: MostCommentedFriendImageChosen =>doSomething4()} }當(dāng)您添加下一個事件時,例如說MostLikedFriendImage,您可以輕松地忘記在actor中添加處理程序案例部分,尤其是當(dāng)有多個actor監(jiān)聽此類事件時。
干違規(guī)溶液
有一種簡單的解決方案可以檢測遺忘的處理程序。 我們可以將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原則。 但是,最危險的是,您團隊中的某個人可能會忘記添加它(就像有人說的那樣: “每個可以被遺忘的手動任務(wù)都會被遺忘” )。 那么也許我們應(yīng)該尋求更好的解決方案?
對任何未處理的事件做出反應(yīng)
幸運的是,我們不會停留在容易出錯的方法上。 當(dāng)actor無法處理傳遞給他的事件時,將引發(fā)UnhandledMessage并將其發(fā)布到ActorSystem的EventStream。
因此,要處理每個被遺忘的事件,我們可以創(chuàng)建偵聽器并將其訂閱到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])就是這樣。 現(xiàn)在,每當(dāng)有一個參與者沒有處理的事件時,我們都會知道這一點,尤其是在非生產(chǎn)環(huán)境中部署應(yīng)用程序時!
翻譯自: https://www.javacodegeeks.com/2014/06/handle-every-event-in-your-akka-application.html
總結(jié)
以上是生活随笔為你收集整理的处理Akka应用程序中的每个事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩Java 8 – Lambda,路径和
- 下一篇: 国内监控摄像头十大品牌是哪几个