f# - Actor 无法接收发送到`mailbox.Sender()` 的消息?
问题描述
我创建了以下测试代码 - .Net core 2.1 控制台应用程序。它仅打印以下消息
TestActor 从 [akka://MySystem/user/Scheduler#1426101451] 收到消息 MyTask ("Test1","Test1")
但是Ok 0
演员无法接收到消息scheduler
?
open System
open Akka.FSharp
open Akka
type MyTask = MyTask of item1: string * item2: string
let system = System.create "MySystem" <| Configuration.load ()
let scheduler (actors: Actor.IActorRef) (mailbox: Actor<Result<int, string>>) =
let rec loop (list: int list list) = actor {
let! m = mailbox.Receive ()
let sender = mailbox.Sender ()
let akkaName = mailbox.Self.Path.Name
printfn "%s received message %A from %A" akkaName m sender
return! loop []
}
actors <! MyTask("Test1", "Test1")
loop []
let processor (mailbox: Actor<MyTask>) =
let rec loop () = actor {
let! m = mailbox.Receive ()
let sender = mailbox.Sender ()
let akkaName = mailbox.Self.Path.Name
printfn "%s received message %A from %A" akkaName m sender
sender <! Ok 0 // scheduler cannot receive this message?
return! loop ()
}
loop ()
[<EntryPoint>]
let main argv =
let actor = spawn system "TestActor" processor
spawn system "Scheduler" (scheduler actor) |> ignore
system.WhenTerminated.Wait()
0
更新:
在我将参数从更改(mailbox: Actor<Result<int, string>>)
为(mailbox: Actor<_>)
?
解决方案
Thescheduler
不是正在回复的MyTask
消息的发送者processor
,因为您正在<!
从 Actor 计算之外执行 tell ( )。这意味着它基本上是在没有发件人的情况下发送的。您可以使用Tell
on 方法IActorRef
与显式发送者一起发送,因为您想从参与者计算的上下文之外发送它:
actors.Tell(MyTask("Test1", "Test1"), mailbox.Self)
编辑
另一个问题是 的mailbox
参数scheduler
类型为Actor<Result<int, string>>
,但由于Ok 0
将Result<int,obj>
在您的上下文中推断,它与参与者类型签名不匹配,并且该消息将被忽略。当定义具有特定消息类型的参与者时,任何不同类型的消息都将被忽略。
推荐阅读
- xamarin.forms - 如何使用 Xamarin.Forms.Maps(无 Xamarin.Forms.GoogleMaps)在地图中应用样式或更改颜色
- sqlite - 我应该如何组织具有唯一主键的表
- javascript - 为什么我会收到“TypeError:无法读取未定义的属性‘Sequelize’”
- javascript - 我想通过单击反应 js 中的按钮来选择输入框中的文本,但我的代码不起作用
- javascript - RxJS:在管道链的下游访问先前的值
- python - 使用 GraphQL +Ariadne + Flask 上传文件:graphql.error.graphql_error.GraphQLError: Operation data should be an JSON object
- windows-store-apps - Microsoft Store 开发人员(个人)的最低年龄是多少?
- maven - Maven pom.xml 中的第一行是什么意思
- bluetooth - 为什么 hci_get_route() 返回 65535?
- css - Material UI - 有没有办法在 MUI 组件中使用 className 道具