Utm线程模型
游客请求和用户请求分别调用UserThreadModeFilter的handleVisitorRequest和handleUserRequest方法,之后再调用各自的过滤器(在UserThreadMode实例化时传入)处理。
默认的游客处理器:VisitorRequestFilterNotQueue:并没有采取队列的形式,直接调用线程池去处理请求。
默认的用户请求处理器:RequestFrequentFilter:将消息放入用户的qtm任务队列中,并触发qtm线程去处理请求;该Filter还会过滤用户频繁的请求( minGap毫秒内超过ringSize个请求,而且违反次数超过illegalMax次,则会认定请求过于频繁)(更详细说明可以查看该类的说明)
如下图,用户线程池为ExcutorService1,游客线程池为ExcutorService2,默认情况下两个使用的其实是同一个线程池,既:ExcutorService1= ExcutorService2,如需要修改,可以调用UserThreadMode的最基本的构造方法(该构造方法由开发者指定游客过滤器和用户过滤器(可以为其指定不同的线程池),其他的构造方法会尝试帮用户构建部分的内容,使得使用起来更加的方便)或者继承重写UserThreadMode的构造方法。
Utm对于用户任务队列的长度并没有限制,而执行线程池ExcutorService是会有长度限制的,utm使用的线程池必须继承LimitedUnboundedThreadPoolExecutor,该类的构造函数参数limitedQueueSize就是队列长度的限制,实际执行中有可能超过该长度,因为utm不会尝试抛弃重要的请求(用户退出、断线等IRequestHandler.isLimited返回false的处理器),但是如果是普通的请求,则当队列满的时候会调用该处理器的queueFull方法(建议只做简单处理,因为服务器队列满往往意味着已经不堪重负了(也有可能是队列长度和线程数量没有设置好,导致无法发挥服务器的处理能力))。