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的感觉了,那就对了… 熟悉的才是最美好的回忆

转载请注明原地址: http://blog.noark.xyz/article/2018/5/20/noark入门之协议映射/