我正在阅读有关Playframework中的Akka actor实现的文档,
https://www.playframework.com/documentation/2.4.x/JavaAkka
其中一段讨论了消息类最佳实践,如下所示:
"此处显示的另一个最佳实践是HelloActor发送和接收的消息被定义为另一个名为HelloActorProtocol的类的静态内部类:"
有人可以详细说明并解释这种最佳做法,这种模式有哪些好处?为什么将消息定义为其他类的静态嵌套类?
提前谢谢!
答案 0 :(得分:2)
我认为这背后的主要思想是隔离发送给特定演员的消息范围。使用类型化协议有助于减少向actor发送意外的协议(或消息)。将它们保存在一个类中是捕获与该特定域相关的所有操作的好方法,例如EmployeeProtocol
有助于强制EmployeeActor
接收预期的消息。但是,您仍有责任正确发送它们:
以下是我们使用协议对EmployeeActor的控制器调用:
public class EmployeeController extends Controller {
return Promise.wrap(ask(employeeActorRef,
new GetCurrentEmployees(), 5000))
.map(response -> ok((JsonNode)response));
}
}
EmployeeActor根据收到的协议处理其消息:
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
}
}
}
此处为员工的操作定义协议,并且可以保存键入的字段,以便我们知道会发生什么。我们在协议中使用静态最终字段这一事实将强制实现消息的不变性:
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-typed - 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