Актер не может получить сообщение, отправленное на `mailbox.Sender ()`?
Я создал следующий тестовый код - консольное приложение.Net core 2.1. Печатает только следующее сообщение
TestActor получил сообщение MyTask ("Test1","Test1") от [akka://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<_>)
?
1 ответ
scheduler
не отправитель MyTask
сообщение на которое processor
отвечает, потому что вы делаете сказать (<!
) извне актер вычислений. Это означает, что он в основном отправляется без отправителя. Вы можете использовать Tell
метод на IActorRef
отправить с явным отправителем, так как вы хотите отправить его вне контекста вашего вычисления актера:
actors.Tell(MyTask("Test1", "Test1"), mailbox.Self)
РЕДАКТИРОВАТЬ
Другая проблема заключается в том, что mailbox
параметр к scheduler
набирается как Actor<Result<int, string>>
, но с тех пор Ok 0
будет выведено как Result<int,obj>
в вашем контексте это не будет соответствовать сигнатуре типа актера, и сообщение будет проигнорировано. При определении субъекта с определенным типом сообщения любые сообщения другого типа будут игнорироваться.