我对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
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
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
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的子项,是否会有所帮助?
发布于 2021-07-20 19:08:49
val actorRefResolver = ActorRefResolver(system.toTyped)
然后
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)https://stackoverflow.com/questions/57427953
复制相似问题