如何在Akka.Remote中使用F#发送带有元组的消息?
我试图在F#中使用remote发送消息,但我一直遇到这样的问题,即类型为的消息从未发送。当我使用下面给出的代码时: Server.fsx如何在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
#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/用户/服务器“
服务器