为什么不是';t我的演员在akka.net中出现异常,并使用F#
我在玩akka.net,试图理解监管。我以为我拿到了,但它没有像我期望的那样工作 我尝试获取一个小样本,其中包含一个监视器和一个子参与者,监视器应该在子对象中出现异常时重新启动子对象。孩子似乎正在重新启动,但我不明白为什么,因为代码似乎没有执行我的为什么不是';t我的演员在akka.net中出现异常,并使用F#,f#,akka.net,F#,Akka.net,我在玩akka.net,试图理解监管。我以为我拿到了,但它没有像我期望的那样工作 我尝试获取一个小样本,其中包含一个监视器和一个子参与者,监视器应该在子对象中出现异常时重新启动子对象。孩子似乎正在重新启动,但我不明白为什么,因为代码似乎没有执行我的管理策略。我更改策略以返回指令。Stop检查是否可以停止参与者,但这也不起作用。所以现在看来我有一个势不可挡的演员,这是一件好事,只要我不想杀了他:)。运行示例的代码如下所示: open Akka open Akka.Actor open Akka.T
管理策略。我更改策略以返回指令。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#的基本部分,不使用它是一个很大的危险信号。谢谢。回到电脑前我会试试的。将系统发送给孩子只是我复制了错误版本的代码,并且我已经更新了代码。当然,这个策略是针对班长的,因为所有的孩子都应该遵循相同的规则。我本应该意识到这一点,但可能有点累了。