0x00消息控制器
消息控制器,主要作用就是为每个模块提供消息处理的入口.
这里的消息不仅仅是协议,还有内部指令,事件等等逻辑入口,这也是为了响应线程模型作出的一种支撑,只要入口在此消息控制器内,那必然走期望的线程调度。
@Controller用于标识一个类为当前模块的消息控制器入口.
@Controller(threadGroup = ExecThreadGroup.PlayerThreadGroup)
public class MailController {
}
参数threadGroup标识此入口是按玩家线程组划分的,每个玩家之前的逻辑互不影响.
@Controller(threadGroup = ExecThreadGroup.ModuleThreadGroup)
public class LoginController {
}
这个就是以模块为单位划分的,就是说这个模块的所有逻辑都是以串型的方式在执行.
0x01协议映射
@PacketMapping注解用来标识一个封包映射到一个处理方法
@PacketMapping(opcode = 1001, state = State.CONNECTED)
public void loginGame(Session session, LoginGameReq request) {
}
参数opcode表示协议编号 参数state表示当前状态才可以调用的执行
如果Session的状态在刚刚链接的情况下接受到1001协议才可以执行此方法
如果正常执行完一个逻辑则会有一行日志
2018-09-04 15:58:32.868 [business-1] INFO AsyncTask.java:59 - handle protocal(opcode=1001),delay=0.15324 ms,exe=3.608036 ms
PacketMapping还有个参数
printLog 是否需要打印协议相关的日志,默认值是true , 如果不想要日志输入 则可以设计为false
比如心跳协议,则不需要输出日志,状态也是不管他登录未登录...
@PacketMapping(opcode = MsgType.KeepalivedReq_VALUE, printLog = false, state = State.ALL)
public void keepalived(Session session, KeepalivedReq request) {
session.send(MsgType.KeepalivedAck_VALUE, KeepalivedAck.newBuilder().setNow(System.currentTimeMillis()).build());
}
是不是找到了当年SpringMvc的感觉了,那就对了... 熟悉的才是最美好的回忆