You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.23
  • Install-Package Akka.Remote -Version 1.4.23
  • Install-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 12:48:02