[英]How Akka Futures and Supervisor Strategies deal with failure
Akka Java在這里。 我剛才讀的阿卡文檔使用期貨“問”的格局 ,我不理解幾件事情是如何工作的,相對於情景當兩個主管戰略(決策者)和失敗回調是圖片的一部分。
說我有兩個演員, Fizz
和Buzz
,其中Fizz
是的父/創作者Buzz
。 因為Fizz
是Buzz
的父母,所以它有一個針對Buzz
的SupervisorStrategy
來處理其失敗:
// Groovy pseudo-code
class Fizz extends UntypedActor {
ActorRef buzz
// Contstructor omitted for brevity, but Buzz is the child of
// Fizz.
@Override
void onReceive(Object message) {
if(message instanceof FizzRequest) {
FizzRequest fReq = message as FizzRequest
// Exceptions thrown here (inside of Buzz) will be
// handled by Fizz’s supervisor strategy.
Future<BuzzData> bDataFut = Patterns.ask(buzz,
fReq.buzzRequest, 500)
bDataFut.onComplete(new GetBuzzDataCallback())
// etc.
} else {
unhandled(message)
}
}
@Override
SupervisorStrategy supervisorStrategy() {
new FizzSupervisorStrategy()
}
}
class Buzz extends UntypedActor {
// …etc.
}
class FizzDecider extends Function<Throwable,Directive> {
@Override
Directive apply(Throwable throwable) {
if(throwable instanceof BuzzIsAngryException) {
return SupervisorStrategy.restart()
}
SupervisorStrategy.stop()
}
}
class FizzSupervisorStrategy extends OneForOneStrategy {
FizzSupervisorStrategy() {
super(true, new FizzDecider())
}
}
class GetBuzzDataCallback extends OnComplete<BuzzData> {
@Override
void onComplete(Throwable failure, BuzzData bData) {
if(failure != null) {
// If Buzz is the child of Fizz, does this code execute, or
// just the FizzDecider above? Or both? I’m so confused!
} else {
// Handle success. Likely use an ‘Inbox’ to send
// ‘bData’ back to Fizz.
}
}
}
有時, Fizz
需要詢問Buzz
一些數據。 發生這種情況時,可能會有以下三種結果之一:
Buzz
成功返回,並為GetBuzzDataCallback
提供bData
; 要么 Buzz
引發BuzzIsAngryException
; 要么 Buzz
引發其他異常/錯誤 我想知道后兩種情況會發生什么:
GetBuzzDataCallback
將異常作為其Throwable failure
參數發送了? 或者,是否調用了FizzFailureDecider
? 或兩個(好像有點多余,如果這兩個回調和決勝局/主管戰略傳遞錯誤復雜化)? 與上述相同,但是現在Fizz
不是 Buzz
的父/創建者。 在這種情況下,我可以僅假設GetBuzzDataCallback
被發送了異常(作為其Throwable failure
參數)嗎?
我想我的問題的根源是:當涉及主管策略和將來的回調時,在引發子異常時,誰會收到通知,並且順序是什么? 如前所述,對我來說,如果兩者都收到失敗/異常,那將更加令人困惑,因為那樣的話,您可能會有一個主管策略來嘗試重新啟動Buzz
而回調則試圖對該異常執行其他操作(可能會發生沖突)。
請注意 :雖然當然不是必需的,但是如果提供的任何代碼段都使用Java而不是 Scala編寫,我將不勝感激(Scala在我看來像象形文字)!
Ask所做的基本上是啟動一個臨時參與者,該參與者將成為消息的發送者,以便收件人進行答復時,它將最終到達該臨時參與者。 臨時演員創建一個Promise
並將其Future
贈送給調用者。 如果答復在給定的超時之前到達,則臨時Promise
將以成功的結果完成Promise
。
監督總是發生在參與者中,並且由於使用參與者來實施問詢,因此與向其他隨機參與者發送信息使監督工作有所不同的交互相比,交互沒有什么不同。
在您的情況下,異常會冒泡給父級演員,以便它可以監督孩子。 然后,除非你以某種方式發送該故障引發的回復消息,超時將達到和臨時ask
-actor將與失敗以后AskTimeoutException
。
因此,由於這種失敗將通過兩種方式到達父母,因此,將“問”模式與父母與孩子進行溝通通常不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.