akka应用_处理Akka应用程序中的每个事件
akka應用
這里的事件,那里的事件,到處都是事件。 發布有關檢查每一項Akka事件最終都能找到歸宿的信息。
Akka和基于事件的React式應用程序是創建軟件的新方法。 在當前基于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原則。 但是,最危險的是,您團隊中的某個人可能會忘記添加它(就像有人說的那樣: “每個可以被遺忘的手動任務都會被遺忘” )。 那么也許我們應該尋求更好的解決方案?
對任何未處理的事件做出React
幸運的是,我們不會停留在容易出錯的方法上。 當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
akka應用
總結
以上是生活随笔為你收集整理的akka应用_处理Akka应用程序中的每个事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重命名Jakarta EE的Java E
- 下一篇: 用于混合Spock 1.x和JUnit