Utm示例-公共部分
首先实现各个事件(登录检查、登录、退出、断线)的处理
1. 登录检查:
继承com.dc.utm.handler.login.OnUserLoginCheckHandler类,实现抽象方法:
queueFull:队列满:在该方法中给前端发送信息提示服务器繁忙不受理该请求
loginCheck:登录检查:检查用户的信息是否正确等,如果错误或者不允许登录则给用户返回错误提示并在该方法返回null(程序不会再往下执行),如果通过检查则返回相应的User对象。
logoutLocalUserWhenUserReLogin:退出在服务上的老用户:当通过登录检查后,OnUserLoginCheckHandler就会调用UserFlagBusiness的setLoginFlag方法(该方法会返回成功、用户在本服务登录、用户在其他服务登录)(具体说明可以看该类说明,该类有个简单实现SimpleLocalUserFlagBusiness(仅用于单个服务,并不建议使用,详见UserFlagBusiness说明)),如果返回用户在本服务登录则会调用这个方法;在该方法需要退出在本服务登录的用户。
logoutRemoteUserWhenUserReLogin:退出在其他服务上登录的用户:通知其他服务退出该用户。
2. 登录:
继承com.dc.utm.handler.login. OnUserLoginHandler类,实现抽象方法:
loginLinkCheck:登录连接检查(在“Utm详细实现 ->用户生命流程 -> 用户登录 -> 详细流程”中已有说明):在服务上登录成功返回 true,登录失败返回false(可以参考sfs的实现和netty的实现)。
userLogin:用户登录成功:用户登录成功后的业务处理和 给前端返回登录成功。
3. 退出:
继承com.dc.utm.handler.logout.OnUserDisconectHandler类,实现抽象方法:
注:LogoutHandler 和OnUserDisconectHandler只有一个会被触发 (LogoutHandler后用户将认为是游客,其断线将不会触发OnUserDisconectHandler)
userLogout:用户退出:用户退出的业务处理和 给前端返回退出成功。
4. 断线:
继承com.dc.utm.handler.logout.OnUserDisconectHandler类,实现抽象方法:
注:LogoutHandler 和OnUserDisconectHandler只有一个会被触发 (LogoutHandler后用户将认为是游客,其断线将不会触发OnUserDisconectHandler)
userDisconect:用户断线:用户断线的业务处理。
然后需要实现用户退出线程(UserLogoutCheckBusiness)的抽象方法:
(用户登录时,如果该用户之前已经登录到服务上,则utm会等待老的用户退出后,才执行新的登录,由这个线程在查看老的用户是否登出,utm在UserFlagBusiness的setLoginFlag方法返回不成功时会自动将用户放入到该实例的等待处理用户中)
waitLogoutTimeOut:等待时间超过maxWaitLogoutTime毫秒,用户依然未从原来的服务上退出 (该方法主要是负责通知前端说登录失败)
接着是实例化utm:(sfs和netty实例化只有细微差别,这里给出sfs的示例):
1.创建两个cmd对应处理器的Map,在后面我们会往其中加入处理器(在sfs中cmd只能是string类型)
//游客请求cmd和对应的请求处理器
Map<String,IRequestHandler> visitorCmdMapHandler =new HashMap<String, IRequestHandler>();
//用户请求cmd和对应的请求处理器
Map<String,IRequestHandler> userCmdMapHandler =new HashMap<String, IRequestHandler>();
2.定义utm的线程池,其中参数32,32为线程数(可以根据实际情况设置),参数500为线程池的队列长度(详细说明见:utm线程模型说明)
//线程池
LimitedUnboundedThreadPoolExecutorpool =
new LimitedUnboundedThreadPoolExecutor(32, 32,0L,
TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(), 500);
3.定义事件管理器(提供了 "用户事件", "异常处理事件", "请求了没有注册的cmd事件", "用户请求过于频繁事件" 的基本实现,如有需要可以继承重写该类)
//事件管理器
EventManager<String,Integer, Visitor, Integer, User> eventManager =new EventManager<String, Integer, Visitor,Integer, User>();
4.实例化Utm(在构造方法中需要指定 登录的cmd 和 断线的cmd)
//实例化utm模型
userThreadMode
= new UserThreadMode<String, Integer, Visitor, Integer, User>(
Cmd.Login.CMD, Cmd.DisConect.CMD, visitorCmdMapHandler, userCmdMapHandler,pool, eventManager);
5.在资源中心中添加用户日志管理器(每个用户的请求和返回的日志,每个用户对应一个目录,如果使用需要注意:1.操作系统中一个进程最大的打开文件的个数,2.操作系统中一个目录下最大的文件数量(这里会采用分级目录的形式确保每一个目录下的文件数量可控))
(这里并非是utm的内容,但可以借鉴该日志资源管理类的申请资源和释放资源)
//添加用户日志资源管理器
userThreadMode.getUserResourceManager().getUserResourceCenter().addUserResource(new UserLoggerResource() );
6.实例化用户标志位管理(在该类中有详细的说明)
//用户登录标志位管理(仅测试,详见该类说明和UserFlagBusiness说明)
SimpleLocalUserFlagBusiness<Visitor,Integer, User> userFlagBusiness =new SimpleLocalUserFlagBusiness<Visitor,Integer, User>();
7.实例化用户登录处理类(用户登录成功后会调用的处理类)
//实例化用户登录处理类(注意:该类不需要注册到userCmdMapHandler中,如果用户登录检查通过,utm会自动调用该实例处理用户登录)
OnUserLoginHandleronUserLoginHandler = new OnUserLoginHandler(userThreadMode.getUserCenter(),eventManager,
userFlagBusiness, userThreadMode.getUserResourceManager().getUserQueueResource(),
userThreadMode.getUserResourceManager().getUserResourceCenter());
8.老用户处理退出线程(上面已经提到)(用户登录时,如果该用户已经在其他客户端登录到服务上,则utm会等待老的用户退出后,才执行新的登录,由这个线程在查看老的用户是否登出)(在后面会启动该线程)
//实例化老用户退出处理类(用户退出检查线程)
UserLogoutConfirmRunnableuserLogoutCheckBusiness =new UserLogoutConfirmRunnable(userThreadMode.getUserCenter(),
userThreadMode.getUserResourceManager().getUserQueueResource(),userThreadMode.getUserRequestFilter(), userFlagBusiness,
onUserLoginHandler, eventManager,userThreadMode.getUserResourceManager().getUserResourceCenter());
9.用户登录检查(登录检查前,连接还不是用户,所以应该放在游客cmd处理器的Map中,如果该检查成功后,就会创建用户相关的资源,并调用前面第7步的用户登录处理类)
//注册游客登录检查的处理器
visitorCmdMapHandler.put(Cmd.Login.CMD,newOnUserLoginCheckHandler(userThreadMode.getUserCenter(), eventManager,
userThreadMode.getUserResourceManager().getUserQueueResource(),userThreadMode.getUserRequestFilter(), userFlagBusiness,
userLogoutCheckBusiness, onUserLoginHandler,userThreadMode.getUserResourceManager().getUserResourceCenter() ));
10.用户断线处理器
//注册用户断线的处理器
userCmdMapHandler.put(Cmd.DisConect.CMD,newOnUserDisconectHandler(userThreadMode.getUserCenter(), eventManager,
userFlagBusiness, userThreadMode.getUserResourceManager().getUserResourceCenter() ));
11.用户退出处理器
//注册用户退出的处理器
userCmdMapHandler.put(Cmd.Logout.CMD,new LogoutHandler(userThreadMode.getUserCenter(), eventManager,
userFlagBusiness, userThreadMode.getUserResourceManager().getUserResourceCenter() ));
12.用户心跳处理器(用作示例:前端和后端如何通过cmd沟通)
//注册用户心跳的处理器
userCmdMapHandler.put(Cmd.Heartbeat.CMD,newHeartbeatHandler());
13.启动第8步实例化的用户退出处理线程
//启动用户退出检查线程
Thread userLogoutCheckRunnable= new Thread(userLogoutCheckBusiness);
userLogoutCheckRunnable.setName("userLogoutCheckRunnable");
userLogoutCheckRunnable.start();
相关推荐
IEEE 802.11-2012版本协议文档 The current revision, IEEE Std 802....— IEEE Std 802.11uTM-2011: Interworking with External Networks (Amendment 9) — IEEE Std 802.11sTM-2011: Mesh Networking (Amendment 10)
1-课程介绍.mp4,网盘文件 2-防火墙简介.mp4 3-安全策略及状态监测.mp4 4-源NAT.mp4 5-目的NAT双向NAT-SLB.mp4 6-双机热备(1).mp4 ...utm-应用行为过滤_rec.mkv utm-邮件过滤_rec.mkv utmurl过滤_rec.mkv
目录 01-配置接口.exe 02-配置管理.exe 03-设备重启.exe 04-软件升级.exe 05-特征库升级.exe 06-配置PPPoE.exe 07-配置NAT-动态地址转换.exe 08-配置NAT-静态地址转换.exe 09-配置NAT-内部服务器.exe ...
目录 01-配置接口.exe 02-配置管理.exe 03-设备重启.exe 04-软件升级.exe 05-特征库升级.exe 06-配置PPPoE.exe 07-配置NAT-动态地址转换.exe 08-配置NAT-静态地址转换.exe 09-配置NAT-内部服务器.exe ...
mysql-5.7.38-winx64.zip 使用说明 ....pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-120140475-null-null.185^v2^control&utm_term=mysql&spm=1018.2226.3001.4450
安装详见“https://blog.csdn.net/Passerby_Wang/article/details/120767020?ops_request_misc=&request_id=&biz_id=102&utm_term=git%202.33.0.2&utm_medium=distribute.pc_search_result.none-task-blog-2~all~...
这个版本的adb是Android开发者日常工作中不可或缺的一部分,用于设备调试、数据传输、安装应用以及进行各种系统级别的操作。 1. **adb的主要功能**: - 设备连接:通过USB或Wi-Fi连接电脑和Android设备,实现设备...
6. **其他辅助功能**:PyGeodesy还提供了计算大地高度、大地垂直曲率、地球曲率半径等辅助函数,为处理地球表面的几何问题提供全方位的支持。 **安装与使用** PyGeodesy库的安装非常简单,通过提供的whl文件...
PyGeodesy是一款专门用于地球几何学计算的Python库,其版本号为19.7.6。该库在Python社区中被广泛使用,尤其适用于那些需要处理地理坐标转换、距离计算以及与地球几何相关的各种问题的开发者。PyGeodesy支持Python 2...
3. **大地坐标转换**:PyGeodesy支持多种坐标系统之间的转换,如经纬度、UTM(通用横轴墨卡托)、Geocentric坐标等。 4. **垂直曲率和水平曲率**:地球并非完美的球体,而是椭球体,因此在不同位置,曲率会有所不同...
1. **坐标系统转换**:PyGeodesy支持多种坐标系统的转换,包括地理坐标(经度和纬度)、UTM(通用横轴墨卡托)坐标、以及ENU(东、北、上)局部坐标系。这些转换在处理全球定位数据时至关重要,因为不同的地理位置...
FortiOS是一个集成的安全操作系统,广泛应用于防火墙、统一威胁管理(UTM)设备、虚拟安全网关等场景。通过`fortiosapi`,开发者可以编写Python脚本,实现对FortiOS设备的自动化配置、状态查询、策略更新等功能,极大...
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-odbc-11.2....
1-104121203-blog-117118786.235%5Ev43%5Epc_blog_bottom_relevance_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-1-104121203-blog-117118786.235%5Ev43%...
3. **坐标转换**:PyGeodesy支持不同坐标系统的转换,包括经纬度、UTM(通用横轴墨卡托)、GEODetic和ELLIPSOID坐标系之间的转换,方便在不同系统间进行数据交换。 4. **地球椭球参数**:库内包含了多种地球椭球...
UTM-30操作说明书1611.pdf UTM-30沥青混合料多功能试验机操作说明书是由B&T公司编制的中文操作手册,版本号为V2.0。本手册提供了UTM-30设备的硬件介绍、软件概述、设备启动和关闭、传感器安装、环境箱使用、通用...
1. **坐标系统支持**:Cartopy 支持多种地理坐标系统,包括经纬度网格、UTM、国家平面坐标系统等,允许用户在不同的坐标系之间转换。 2. **地图投影**:内置了超过40种不同的地图投影方式,如 Mercator、Lambert ...
教程:...utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
在Windows环境下,安装Basemap可能需要额外的依赖,如GDAL、geos等,但幸运的是,PyProj的这个版本已经包含了必要的部分,可以辅助Basemap完成大部分地理空间操作。这意味着,一旦成功安装了"pyproj-1.9.5.1-cp36-cp...
The Postman app postman-linux-x64.tar.gz 官方 2022.09.14 下载 Linux 64 bit 因网络不方便, 下载官方版的放此 出处: https://www.postman.com/downloads/?utm_source=postman-home