作为单机 Actor 结构目前已经实现简单的转发功能, 但是需要注意对于客户端消息来说有以下区分:
请求(request): 客户端主动推送给服务端消息包 响应(response): 服务端主动推送给客户端消息包 需要区分 长连接 和 短连接 区别, 短连接(HTTP) 要求从发起到响应必须双向(请求必须要带响应); 而长连接(TCP|UDP) 是非双向, 也就是可能只有请求而没有响应或者干脆只有响应.
我们编写的简单 Actor 虽然完成基本将客户端消息请求功能, 但是目前没有合适的响应功能, 而没有合适响应功能也就没办法实现我们之前 服务端心跳包 需求.
但是这时候不要先急着去实现, 而是要回头思考下: 为什么消息格式能够被正确转发?
消息传递 从 ActorRef<T> 得出这里面推送的消息结构是泛型, 也就是可能本身也就是 Object 对象, 而 createReceive 的回调就更加明显展示消息转化流程:
public <M extends T> ReceiveBuilder<T> onMessage(final Class<M> type, final Function<M, Behavior<T>> handler) { OptionVal.Some var10000 = org.apache.pekko.util.OptionVal.Some..MODULE$; org.apache.pekko.util.OptionVal..MODULE$.None(); // 关键的转化流程, 实际上就是按照传入的动态类型转化写入匹配路由 Case var3 = new Case(type, (Predicate) null, handler); this.messageHandlers_$eq((List) this.messageHandlers().$plus$colon(var3)); return this; } 这个方法往下就能看到 class Case<BT, MT> implements Product, Serializable 转化类, 其中关键内容方法已经展示出来了: