为什么不是';t我的演员在akka.net中出现异常,并使用F#

为什么不是';t我的演员在akka.net中出现异常,并使用F#,f#,akka.net,F#,Akka.net,我在玩akka.net,试图理解监管。我以为我拿到了,但它没有像我期望的那样工作 我尝试获取一个小样本,其中包含一个监视器和一个子参与者,监视器应该在子对象中出现异常时重新启动子对象。孩子似乎正在重新启动,但我不明白为什么,因为代码似乎没有执行我的管理策略。我更改策略以返回指令。Stop检查是否可以停止参与者,但这也不起作用。所以现在看来我有一个势不可挡的演员,这是一件好事,只要我不想杀了他:)。运行示例的代码如下所示: open Akka open Akka.Actor open Akka.T

我在玩akka.net,试图理解监管。我以为我拿到了,但它没有像我期望的那样工作

我尝试获取一个小样本,其中包含一个监视器和一个子参与者,监视器应该在子对象中出现异常时重新启动子对象。孩子似乎正在重新启动,但我不明白为什么,因为代码似乎没有执行我的
管理策略。我更改策略以返回
指令。Stop
检查是否可以停止参与者,但这也不起作用。所以现在看来我有一个势不可挡的演员,这是一件好事,只要我不想杀了他:)。运行示例的代码如下所示:

open Akka
open Akka.Actor
open Akka.Tools
open Akka.FSharp
open System

type MonitorMessage =
    | Create

type ChildMessage =
    | Ping
    | Kill

let test() =
    let systemName = "my-system"
    let system = System.create systemName (Configuration.load())

    let handleChildMessage = function
        | Ping ->
            printfn "Received %A" Ping
            printfn "Pong: %A" (DateTime.Now.Ticks)
        | Kill ->
            1/0 |> ignore

    let createChild parent id =
        spawnOpt parent (id.ToString()) (actorOf handleChildMessage)
            [ SpawnOption.SupervisorStrategy (Strategy.OneForOne (fun error ->
                match error with
                | _ ->
                    printfn "%A" error
                    Directive.Stop
                    )) ]

    let handleMonitorMessage (actor:Actor<MonitorMessage>) message =
        match message with
        | Create ->
            let sender = actor.Sender()
            sender <! createChild actor (Guid.NewGuid())

    let monitor = spawn system "monitor" (actorOf2 handleMonitorMessage)
    let child = monitor <? Create |> Async.RunSynchronously
    child <! Ping
    child <! Kill
    child <! Ping

test()
Console.ReadLine() |> ignore
openakka
打开阿克卡,演员
打开阿克卡。工具
打开Akka.FSharp
开放系统
类型监视消息=
|创造
键入ChildMessage=
|平
|杀死
let test()=
让systemName=“我的系统”
让system=system.create systemName(Configuration.load())
让handleChildMessage=函数
|Ping->
printfn“收到%A”Ping
printfn“Pong:%A”(DateTime.Now.Ticks)
|杀死->
1/0 |>忽略
让createChild父id=
spawnOpt父项(id.ToString())(actorOf handleChildMessage)
[spawnpoption.SupervisorStrategy(Strategy.OneForOne)(有趣的错误->
匹配错误
| _ ->
printfn“%A”错误
指令,停
)) ]
让handleMonitorMessage(actor:actor)消息=
将消息与匹配
|创建->
让sender=actor.sender()
发送方异步运行
儿童忽视
  • 您的
    createChild
    函数不会将参与者创建为监视器的子级。这是因为您已将actor系统传递给spawnOpt函数——这意味着,派生的actor将是顶级的(直接位于actor系统内核之下)。您需要将其更改为
    spawnOpt parent
    ,以便将其创建为父级的子级
  • 监督策略选项意味着,拥有监督策略的参与者将把监督策略应用到其子女身上。因此,您需要将其设置为监视器,而不是儿童

  • 如果你不介意我问你F的多少,你知道吗?代码中有非常基本的错误。
    1/0 |>ignore
    抛出,
    ()
    没有。不过,在那里使用
    failwith
    raise
    可能会更好。@GuyCoder,我确实知道相当多的F。我只是在几分钟内设置了一个小样本。出于好奇,你认为有什么错误。@TeaDrivenDev,
    1/0
    只是我的强迫和错误。当然,其他两个选项更好:)我只是快速查看了代码,看到了
    1/0 |>ignore
    。每当我看到
    |>忽略
    时,我都会专注于它。如果它与有副作用的C#有关,那么它更可能是正确的,但如果它与纯F#有关,那么我真的仔细观察了一下。看到
    |>ignore
    后,识别出
    1/0
    ,这是另一个危险信号。在这段代码中,
    1\0 |>ignore
    的明显替换是
    ()
    。单位类型
    ()
    是F#的基本部分,不使用它是一个很大的危险信号。谢谢。回到电脑前我会试试的。将系统发送给孩子只是我复制了错误版本的代码,并且我已经更新了代码。当然,这个策略是针对班长的,因为所有的孩子都应该遵循相同的规则。我本应该意识到这一点,但可能有点累了。