首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Akka类型中,如何在没有ActorSystem的情况下反序列化序列化的ActorRef?

在Akka类型中,如何在没有ActorSystem的情况下反序列化序列化的ActorRef?
EN

Stack Overflow用户
提问于 2019-08-09 18:14:52
回答 1查看 248关注 0票数 1

我对Akka的世界非常陌生,更不用说Akka类型的了。如果这个很愚蠢,我也很抱歉:(

因此,我遵循了请求-响应交互模式,以便参与者进行交互。这意味着在我的命令中添加一个actorRef。

但是,我的命令都在protobuf中。我必须序列化actorRef。在不知道actor1 2的actorRef的情况下,actor1如何反序列化actor2的ActorSystem?

我读到了一个答案:(https://manuel.bernhardt.io/2018/07/20/akka-anti-patterns-java-serialization/#comment-157564)但是我很难理解这个解决方案……:(

WorkgroupCommand.proto

代码语言:javascript
复制
message WorkgroupCommand {
    oneof sealed_value {
        EnqueueWorkDone enq = 1;
        QueueFull qF = 2;
    }
}

message EnqueueWorkDone {
    required string id = 1;
    required string replyTo = 2; //serialized actorRef
}

Workgroup.scala

代码语言:javascript
复制
private val system1 = ActorSystem(Behaviors.empty, "system-1")

val commandHandler:(State, WorkgroupCommand) => Effect[Event,State] ={
  case (state, EnqueueWorkDone(id, replyTo)) =>
     //how to deserialize replyTo ?????

}

Agent.scala

代码语言:javascript
复制
private val system2 = ActorSystem(mainBehavior, "system-2")
private val resolver = ActorRefResolver(system2.toTyped)

def mainBehavior = Behaviors.setup{ context => 
  //assuming the we have the Workgroup actor
  Workgroup ! EnqueueWorkDone("12345",
                resolver.toSerializationFormat(context.self))

  Behaviors.same
}

有什么办法吗?如果工作组和座席都是主actorSystem的子项,是否会有所帮助?

EN

回答 1

Stack Overflow用户

发布于 2021-07-20 19:08:49

val actorRefResolver = ActorRefResolver(system.toTyped)

然后

代码语言:javascript
复制
val serializedActorRef: Array[Byte]= actorRefResolver.toSerializationFormat(replyTo).getBytes(StandardCharsets.UTF_8)

val str = new String(serializedActorRef, StandardCharsets.UTF_8)

val deserializedActorRef = actorRefResolver.resolveActorRef[SomeType.type](str)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57427953

复制
相关文章

相似问题

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