ActixのHandlerのhandleメソッドでFutureを返却して送信元のActorで実行する
actix/actix: Actor framework for Rust
でHandler
からFuture
を返そうとして失敗し続けて何もわからん…
ってなってました.
ハマったポイントはロジックのResult
のErr
とFuture
のErr
は別だと思っていたところです.
そこは同一なので,
ResponseFuture
の第2型引数にはエラーを単独で渡す必要があります.
ハマり続けていた原因はslack_hook::Result
を使っていたため,
エラーが単独で見づらかったところにもあるでしょう.
まずメッセージを定義します.
#[derive(Debug, Message)]
#[rtype(result = "slack_hook::Result<()>")]
pub struct Start;
この時メッセージのresult
がResult
になっていても
impl Handler<Start> for Foo {
type Result = ResponseFuture<slack_hook::Result<()>, Error>;
}
のようにしてはいけません. 正解は
impl Handler<Start> for Foo {
type Result = ResponseFuture<(), slack_hook::Error>;
}
です.
Futureが失敗する理由にロジック以外の外的要因などがあると思い込んでいたのが敗因です.
思えばstd::future
は失敗しない関数向けにResult
じゃないバージョンを提供する予定なのですから別なのは当たり前ですね.
これでメッセージの送信元がFuture
を手に入れることが出来て,
ctx.spawn
を使って起動して送信元でエラーハンドリングすることが可能になります.
ハンドラの受信側が起動するよりメリットがあります.