溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

akka系統(tǒng)中停止運(yùn)行任務(wù)的問(wèn)題

發(fā)布時(shí)間:2020-07-31 22:19:23 來(lái)源:網(wǎng)絡(luò) 閱讀:2504 作者:金明略 欄目:開(kāi)發(fā)技術(shù)

   上周的工作中遇到了一個(gè)停止運(yùn)行任務(wù)時(shí)的問(wèn)題,就是在一個(gè)任務(wù)運(yùn)行到一半時(shí)需要停止的問(wèn)題。正常的需求是一按停止按鈕,就要立即停止,但現(xiàn)在都要等程序運(yùn)行完才能停止,現(xiàn)在是一個(gè)bug。由于之前寫(xiě)任務(wù)運(yùn)行邏輯的不是我,因此我先花一個(gè)小時(shí)苦讀大神們的代碼,了解了他們對(duì)于任務(wù)運(yùn)行那塊的邏輯,發(fā)現(xiàn)是首先前端發(fā)消息給一個(gè)Actor,然后這個(gè)Actor用actorOf方法創(chuàng)建許多子Actor,然后再對(duì)這些Actor調(diào)用ActorSelection創(chuàng)建運(yùn)行這個(gè)任務(wù)的Actor。

   之前以為通過(guò)獲取Actor的地址,終止這個(gè)Actor,然后自動(dòng)終止其所有子Actor應(yīng)該就能停止任務(wù)了,后來(lái)發(fā)現(xiàn)根本停不下來(lái)。

   第一次嘗試是在狀態(tài)機(jī)FSM中不僅在whenUnhandled方式下停止Actor,而且在其他每一種狀態(tài)下都調(diào)用停止Actor操作,直接終止運(yùn)行該線(xiàn)程的Actor。

   這里順便普及一下停止Actor的時(shí)候,是給該Actor發(fā)送兩種消息,Kill或者PoisonPill。使用Kill消息可以在不損失緩沖區(qū)中消息的情況下重啟Actor對(duì)象,但是不會(huì)停止Actor對(duì)象,僅僅是重啟,而且會(huì)拋出異常,使用PoisonPill消息可以停止Actor對(duì)象,但允許Actor對(duì)象處理完收到PoisonPill消息之前存儲(chǔ)在緩沖區(qū)中的消息。然后我又嘗試了context.stop(actorRef)去直接停止某Actor,同樣無(wú)濟(jì)于事,線(xiàn)程依舊瀟灑地運(yùn)行結(jié)束。

   這個(gè)時(shí)候我發(fā)現(xiàn)問(wèn)題應(yīng)該轉(zhuǎn)移到線(xiàn)程級(jí)別,既然終止Actor是不起作用的,我就干脆把這個(gè)線(xiàn)程終止掉。一開(kāi)始我們采用給運(yùn)行線(xiàn)程的Actor發(fā)送消息的方式終止該線(xiàn)程,發(fā)現(xiàn)能停止,但還是在任務(wù)運(yùn)行完之后停止。后來(lái)我意識(shí)到,Actor處理消息應(yīng)該是按照發(fā)送順序來(lái)的,首先發(fā)送的消息是處理這個(gè)任務(wù),所以只有處理完任務(wù)才會(huì)處理停止線(xiàn)程這個(gè)消息,此時(shí)線(xiàn)程已經(jīng)不是運(yùn)行狀態(tài)了。因此我干脆定義了一個(gè)線(xiàn)程安全的HashMap,保存了id和Process對(duì)象的映射關(guān)系,可以通過(guò)這個(gè)數(shù)據(jù)結(jié)構(gòu)搜索到線(xiàn)程對(duì)象,當(dāng)父Actor收到終止任務(wù)命令時(shí),不再向運(yùn)行該任務(wù)的子Actor發(fā)送消息,而是在父Actor中直接調(diào)用運(yùn)行任務(wù)的線(xiàn)程的Process對(duì)象里的destroy方法,直接終止這個(gè)線(xiàn)程,終于成功了。

   得出結(jié)論就是,akka系統(tǒng)對(duì)于線(xiàn)程粒度的啟??刂瓶赡苓€是有一定缺陷,需要我們根據(jù)線(xiàn)程的Process對(duì)象自己來(lái)做停止操作。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI