如何在Akka.Remote中使用F#发送带有元组的消息?

如何在Akka.Remote中使用F#发送带有元组的消息?,f#,akka,akka.net,f#-interactive,F#,Akka,Akka.net,F# Interactive,我试图在F#中使用remote发送消息,但我一直遇到这样的问题,即类型为的消息从未发送。当我使用下面给出的代码时: Server.fsx #r "nuget: Akka.FSharp" #r "nuget: Akka.TestKit" #r "nuget: Akka.Remote" open System open Akka.FSharp open Akka.Remote open Akka.Configuration let

我试图在F#中使用remote发送消息,但我一直遇到这样的问题,即类型为的消息从未发送。当我使用下面给出的代码时:

Server.fsx

#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"



open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = 192.168.0.94
                }
            }
        }")

let serversystem = System.create "Server" configuration



let server (mailbox:Actor<_>) =
    let rec loop () = actor {
        let! message = mailbox.Receive()
        printfn "%s" message
    }
    loop ()

let serveRef = spawn serversystem "server" server
Console.ReadLine() |> ignore
#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"
#load "Message.fsx"

open Message
open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = 192.168.0.94
                }
            }
        }")

let serversystem = System.create "Server" configuration



let server (mailbox:Actor<_>) =
    let rec loop () = actor {
        let! message = mailbox.Receive()
        match message with
        | Message(num) -> printfn "Got a number %d" num
    }
    loop ()

let serveRef = spawn serversystem "server" server
Console.ReadLine() |> ignore
#load "Message.fsx"

open Message
open System
open Akkling

let configuration = 
    Configuration.parse
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = localhost
                }
            }
        }"

let serversystem = System.create "Server" configuration

let rec server = function
| Message(num) ->
    printfn "Got a number %d" num
    become server

let serveRef = spawn serversystem "server" <| props(actorOf server)
Console.ReadLine() |> ignore
现在代码是

Server.fsx

#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"



open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = 192.168.0.94
                }
            }
        }")

let serversystem = System.create "Server" configuration



let server (mailbox:Actor<_>) =
    let rec loop () = actor {
        let! message = mailbox.Receive()
        printfn "%s" message
    }
    loop ()

let serveRef = spawn serversystem "server" server
Console.ReadLine() |> ignore
#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"
#load "Message.fsx"

open Message
open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = 192.168.0.94
                }
            }
        }")

let serversystem = System.create "Server" configuration



let server (mailbox:Actor<_>) =
    let rec loop () = actor {
        let! message = mailbox.Receive()
        match message with
        | Message(num) -> printfn "Got a number %d" num
    }
    loop ()

let serveRef = spawn serversystem "server" server
Console.ReadLine() |> ignore
#load "Message.fsx"

open Message
open System
open Akkling

let configuration = 
    Configuration.parse
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = localhost
                }
            }
        }"

let serversystem = System.create "Server" configuration

let rec server = function
| Message(num) ->
    printfn "Got a number %d" num
    become server

let serveRef = spawn serversystem "server" <| props(actorOf server)
Console.ReadLine() |> ignore
在这种情况下,消息永远不会被打印出来。发送前是否需要对邮件进行序列化?如果是,那么怎么做? 否则,我做错了什么?
非常感谢您的帮助。

Akka默认使用Newtonsoft.Json来区分工会。您可以切换到不同的序列化程序(例如Akka.Serialization.Hyperion)或使用例如F#优化的Akka.FSharp fork。 使用Akkling时,您的系统可能会如下所示:

Message.fsx

type Message = 
              | Message of int
#r "nuget: Akkling" 
#r "nuget: Akka.Remote"
#r "nuget: Newtonsoft.Json"

type Message = Message of int
Server.fsx

#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"



open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = 192.168.0.94
                }
            }
        }")

let serversystem = System.create "Server" configuration



let server (mailbox:Actor<_>) =
    let rec loop () = actor {
        let! message = mailbox.Receive()
        printfn "%s" message
    }
    loop ()

let serveRef = spawn serversystem "server" server
Console.ReadLine() |> ignore
#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"
#load "Message.fsx"

open Message
open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = 192.168.0.94
                }
            }
        }")

let serversystem = System.create "Server" configuration



let server (mailbox:Actor<_>) =
    let rec loop () = actor {
        let! message = mailbox.Receive()
        match message with
        | Message(num) -> printfn "Got a number %d" num
    }
    loop ()

let serveRef = spawn serversystem "server" server
Console.ReadLine() |> ignore
#load "Message.fsx"

open Message
open System
open Akkling

let configuration = 
    Configuration.parse
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                debug : {
                    receive : on
                    autoreceive : on
                    lifecycle : on
                    event-stream : on
                    unhandled : on
                }
            }
            remote {
                helios.tcp {
                    port = 9002
                    hostname = localhost
                }
            }
        }"

let serversystem = System.create "Server" configuration

let rec server = function
| Message(num) ->
    printfn "Got a number %d" num
    become server

let serveRef = spawn serversystem "server" <| props(actorOf server)
Console.ReadLine() |> ignore
#加载“Message.fsx”
公开信息
开放系统
开放阿克林
让配置=
配置解析
@“阿克卡{
演员{
provider=”“Akka.Remote.RemoteActorRefProvider,Akka.Remote“”
调试:{
接收:在
自动接收:on
生命周期:开启
事件流:打开
未处理:打开
}
}
遥远的{
helios.tcp{
端口=9002
主机名=本地主机
}
}
}"
让serversystem=System.create“Server”配置
让rec server=函数
|消息(num)->
printfn“得到一个数字%d”num
成为服务器
让serveRef=spawn服务器系统“server”忽略
Client.fsx

#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"

open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                
            }
            remote {
                helios.tcp {
                    port = 2552
                    hostname = localhost
                }
            }
        }")

let clientSystem = System.create "client" configuration

let serveRef = select ("akka.tcp://Server@192.168.0.94:9002/user/server") clientSystem
serveRef <! "Register"
Console.ReadLine()
#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit"
#r "nuget: Akka.Remote"
#load "Message.fsx"

open Message
open System
open Akka.FSharp
open Akka.Remote
open Akka.Configuration

let configuration = 
    ConfigurationFactory.ParseString(
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                
            }
            remote {
                helios.tcp {
                    port = 2552
                    hostname = localhost
                }
            }
        }")

let clientSystem = System.create "client" configuration

let serveRef = select ("akka.tcp://Server@192.168.0.94:9002/user/server") clientSystem
serveRef <! Message(10)
Console.ReadLine()
#load "Message.fsx"

open Message
open System
open Akkling

let configuration =
    Configuration.parse
        @"akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
            }
            remote {
                helios.tcp {
                    port = 2552
                    hostname = localhost
                }
            }
        }"

let clientSystem = System.create "client" configuration

let serveRef = select clientSystem "akka.tcp://Server@localhost:9002/user/server"
serveRef <! Message(10)
Console.ReadLine()
#加载“Message.fsx”
公开信息
开放系统
开放阿克林
let配置=
配置解析
@“阿克卡{
演员{
provider=”“Akka.Remote.RemoteActorRefProvider,Akka.Remote“”
}
遥远的{
helios.tcp{
端口=2552
主机名=本地主机
}
}
}"
让clientSystem=System.create“client”配置
让serveRef=选择clientSystem“akka”。tcp://Server@本地主机:9002/用户/服务器“
服务器