播放2.4-Java - 演员消息协议最佳实践

时间:2015-09-08 18:57:55

标签: java playframework akka

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

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

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

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

有人可以详细说明并解释这种最佳做法,这种模式有哪些好处?为什么将消息定义为其他类的静态嵌套类?

提前谢谢!

1 个答案:

答案 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