首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Akka.Remote和F#中用元组发送消息?

如何在Akka.Remote和F#中用元组发送消息?
EN

Stack Overflow用户
提问于 2020-12-01 02:52:05
回答 1查看 312关注 0票数 3

我试图在F#中使用远程发送一条消息,但是我一直遇到这样的问题:没有发送带有类型的消息。当我使用以下代码时:

Server.fsx

代码语言:javascript
复制
#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

Client.fsx

代码语言:javascript
复制
#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()

该消息是发送的,我可以看到一个“寄存器”打印在服务器终端。但是当我尝试使用被发送的特定类型的消息时,问题就出现了。

服务器终端上的输出:

代码语言:javascript
复制
[INFO][12/1/2020 2:37:43 AM][Thread 0001][remoting (akka://Server)] Starting remoting
[INFO][12/1/2020 2:37:43 AM][Thread 0001][remoting (akka://Server)] Remoting started; listening on addresses : [akka.tcp://Server@192.168.0.94:9002]
[INFO][12/1/2020 2:37:43 AM][Thread 0001][remoting (akka://Server)] Remoting now listens on addresses: [akka.tcp://Server@192.168.0.94:9002]
Register

现在代码是

Server.fsx

代码语言:javascript
复制
#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

Client.fsx

代码语言:javascript
复制
#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()

Message.fsx

代码语言:javascript
复制
type Message = 
              | Message of int

在这种情况下,消息永远不会被打印出来。在发送之前,我们需要序列化消息吗?如果是,那怎么做呢?不然,我做错什么了?任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 12:49:35

Akka默认使用Newtonsoft.Json,不可能 往返机票歧视工会。您可以切换到不同的序列化程序(如Akka.Serialization.Hyperion)或使用例如阿克克林,一个F#优化的Akka.FSharp叉。使用Akkling您的系统可能如下所示:

Message.fsx

代码语言:javascript
复制
#r "nuget: Akkling" 
#r "nuget: Akka.Remote"
#r "nuget: Newtonsoft.Json"

type Message = Message of int

Server.fsx

代码语言:javascript
复制
#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

Client.fsx

代码语言:javascript
复制
#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()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65084054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档