我创建了以下测试代码- .Net核心2.1控制台应用程序。它只打印以下消息
TestActor从akka接收到消息MyTask ("Test1","Test1")://MySystem/user/Scheduler#1426101451
但是,参与者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<_>)后,它就可以工作了。
发布于 2018-10-03 14:44:18
scheduler不是processor响应的MyTask消息的发送方,因为您正在从参与者计算之外执行tell (<!)操作。这意味着它基本上是在没有发送者的情况下发送的。您可以使用Tell方法在IActorRef上与显式发送方一起发送,因为您希望从参与者计算的上下文之外发送它:
actors.Tell(MyTask("Test1", "Test1"), mailbox.Self)
编辑
另一个问题是,mailbox参数的scheduler被键入为Actor<Result<int, string>>,但是由于在上下文中Ok 0将被推断为Result<int,obj>,因此它将与参与者类型签名不匹配,并且消息将被忽略。当使用特定消息类型定义参与者时,任何不同类型的消息都将被忽略。
https://stackoverflow.com/questions/52629469
复制相似问题