gpt4 book ai didi

java - Play 2.4-Java - Actor 消息协议(protocol)最佳实践

转载 作者:行者123 更新时间:2023-11-30 03:16:24 26 4
gpt4 key购买 nike

我正在阅读有关 Playframework 中 Akka Actor 实现的文档,

https://www.playframework.com/documentation/2.4.x/JavaAkka

其中一个段落讨论了消息类最佳实践,如下所示:

“此处显示的另一个最佳实践是,HelloActor 发送和接收的消息被定义为另一个名为 HelloActorProtocol 的类的静态内部类:”

有人可以详细说明并解释这一最佳实践以及这种模式的好处是什么吗?为什么消息应该定义为其他类的静态嵌套类?

提前谢谢您!

最佳答案

我相信这背后的主要思想是隔离发送到特定参与者的消息的范围。输入协议(protocol)有助于减少向参与者发送意外协议(protocol)(或消息)的情况。将它们保留在一个类中是捕获与特定域相关的所有操作的好方法,例如 EmployeeProtocol 有助于强制 EmployeeActor 接收预期消息。但是,您仍然有责任正确发送它们:

这是我们使用协议(protocol)对 EmployeeActor 进行的 Controller 调用:

public class EmployeeController extends Controller {
return Promise.wrap(ask(employeeActorRef,
new GetCurrentEmployees(), 5000))
.map(response -> ok((JsonNode)response));
}
}

EmployeeActor 根据收到的协议(protocol)处理其消息:

public class EmployeeActor extends UntypedActor {

@Override
public void onReceive(Object message) throws Exception {
if (message instanceof GetCurrentEmployees) {
//do things related to this task
} else if (message instanceof CreateNewEmployee) {
//do things related to this task
} else if (message instanceof RemoveEmployee) {
//do things related to this task
}
}
}

这里的协议(protocol)是针对员工的操作定义的,并且可以保存键入的字段,以便我们知道会发生什么。事实上,我们在协议(protocol)中使用静态最终字段将强制消息的不变性:

public class EmployeeProtocol {

public static class GetCurrentEmployees {}
public static class CreateNewEmployee {
private final String name;
public CreateNewEmployee(String name) {
this.name = name;
}
//getter
}
public static class RemoveEmployee {
public final String uuidToRemove;
public RemoveEmployee(String uuidToRemove) {
this.uuidToRemove = uuidToRemove;
}
//getter
}
}

Akka-Typed 正在 akka scala 中开发,它可用于仅发送特定类型的消息,因此如果您尝试发送不正确的消息类型,编译器会提示。 Akka 类型 - http://doc.akka.io/docs/akka/snapshot/scala/typed.html#typed-scala

也许他们希望我们使用这种最佳实践,因为我们将来能够使其类型安全...在此播客中还提到了 Java 的这一点:https://www.typesafe.com/resources/video/akka-2-4-plus-new-commercial-features-in-typesafe-reactive-platform

关于java - Play 2.4-Java - Actor 消息协议(protocol)最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com