Akka F#中Discriminated Unions作为Actor消息发送失败问题求助
Akka - F# 中的可区分联合(Discriminated Unions)作为消息
我无法向Akka Actor发送可区分联合类型的消息,如果有人能提供相关实现示例,我将非常感谢。
我自己的尝试代码托管在公开代码仓库,下方是代码片段,该示例是对公开Chat项目的精简改写。
问题现象
DU类型消息永远无法送达服务端Actor的目标接收逻辑,会被发送到死信队列。如果改为发送Object类型的消息则可以正常送达。
如果我发送DU类型消息,但将服务端Actor设置为监听通用Object类型,消息确实能到达,但它的类型显示为:
seq [seq [seq []]
我无法获取到底层的DU类型实例。
我尝试作为消息发送的DU定义
type PrinterJob = | PrintThis of string | Teardown
客户端代码
let system = System.create "MyClient" config let chatClientActor = spawn system "ChatClient" <| fun mailbox -> let server = mailbox.Context.ActorSelection("akka.tcp://MyServer@localhost:8081/user/ChatServer") let rec loop nick = actor { let! (msg:PrinterJob) = mailbox.Receive() server.Tell(msg) return! loop nick } loop "" while true do let input = Console.ReadLine() chatClientActor.Tell(PrintThis(input))
消息从控制台输入后转发到客户端Actor:
while true do let input = Console.ReadLine() chatClientActor.Tell(PrintThis(input))
服务端代码
let system = System.create "MyServer" config let chatServerActor = spawn system "ChatServer" <| fun (mailbox:Actor<_>) -> let rec loop (clients:Akka.Actor.IActorRef list) = actor { let! (msg:PrinterJob) = mailbox.Receive() printfn "Received %A" msg //Received seq [seq [seq []]; seq [seq [seq []]]] ??? match msg with | PrintThis str -> Console.WriteLine("Printing: {0} Do we get this?", str) return! loop clients | Teardown -> Console.WriteLine("Tearing down now") return! loop clients } loop []
依赖包
我没有使用paket,用到的包的PM安装命令如下:
Install-Package Akka -Version 1.4.23Install-Package Akka.Remote -Version 1.4.23Install-Package Akka.FSharp -Version 1.4.23
应用运行在net5.0环境下。
构造函数参数名称异常现象?
当传递类实例作为对象时,Akka似乎对构造函数参数的名称很敏感:消息可以被处理,但数据无法从客户端复制到服务端。如果你有一个名为Username的属性,构造函数参数不能命名为例如uName,否则当它到达服务器时其值为null。相关代码在params分支中。
type DoesWork(montelimar: string) = member x.Montelimar = montelimar type DoesNotWork(montelimaro: string) = member x.Montelimar = montelimaro
内容的提问来源于stack exchange,提问作者tweega
相关产品推荐
相关产品推荐

