【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现
一、orika工具使用
1)工具类
package com.xinyue.game.utils;import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;/*** @author 王广帅* @since 2022/2/8 22:37*/
public class XyBeanCopyUtil {private static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();/*** 将对象S的数据,复制到对象T中** @param data 要复制的数据对象* @param clazz 新的接收数据的对象class* @param <S>* @param <T>* @return*/public static <S, T> T copyObj(S data, Class<T> clazz) {return mapperFactory.getMapperFacade().map(data, clazz);}
}
2)测试
package com.xinyue.game.utils;import com.xinyue.game.utils.model.TestUser;
import org.testng.Assert;
import org.testng.annotations.Test;/*** @author 王广帅* @since 2022/2/13 19:38*/
public class XyBeanCopyUtilTest {@Testpublic void testCopyObj() {TestUser testUser = new TestUser();String name = "aaa";testUser.setName(name);String key = "1";String value = "北京";testUser.getAddressMap().put(key, value);TestUser newUser = XyBeanCopyUtil.copyObj(testUser, TestUser.class);Assert.assertEquals(newUser.getName(), name);Assert.assertEquals(newUser.getAddressMap().get(key), testUser.getAddressMap().get(key));}
}

可以看出是深拷贝!!!
我们在开发中,经常需要异步线程进行数据库的落地,这里就用到了深拷贝技术,我们无需考虑List,因为游戏中都是单个实体进行落地的。
二、游戏中定时落地实现
1.时机1:缓存中移除时
@PostConstructpublic void init() {roleCache = CacheBuilder.newBuilder().expireAfterAccess(Duration.ofMinutes(gameServerConfig.getExpireOfAccess())).initialCapacity(1000).maximumSize(gameServerConfig.getMaxCacheSize()).removalListener(new RemovalListener<String, PlayerEntity>() {@Overridepublic void onRemoval(RemovalNotification<String, PlayerEntity> notification) {logger.info("角色被从内存中移除,更新一次到数据库,playerId:{}", notification.getKey());PlayerEntity playerEntity = notification.getValue();flushPlayer(playerEntity);}}).build();}
2.时机2:下线时
@EventListenerpublic void logoutEvent(LoginOutEvent event) {// 用户下线时,刷新一下缓存this.flushPlayer(event.getPlayerId());logger.info("用户下线,刷新缓存,playerId:{},threadId:{}", event.getPlayerId(), Thread.currentThread().getId());}
3.落地实现
public void flushPlayer(String roleId) {PlayerEntity playerEntity = this.getPlayerIfPresent(roleId);this.flushPlayer(playerEntity);}private void flushPlayer(PlayerEntity playerEntity) {if (playerEntity != null) {// 深拷贝出来当前对象PlayerEntity newPlayerEntity = XyBeanCopyUtil.copyObj(playerEntity, PlayerEntity.class);// 异步线程进行落地gameAsyncTaskService.execute(String.valueOf(playerEntity.getPlayerId()), "更新role信息", () -> {this.daoPlayerService.updatePlayer(newPlayerEntity);});}}
相关文章:
【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现
一、orika工具使用 1)工具类 package com.xinyue.game.utils;import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory;/*** author 王广帅* since 2022/2/8 22:37*/ public class XyBeanCopyUtil {private static MapperFactory mappe…...
在 Ubuntu 上安装 MySQL 的详细指南
在Ubuntu环境中安装 mysql-server 以及 MySQL 开发包(包括头文件和动态库文件),并处理最新版本MySQL初始自动生成的用户名和密码,可以通过官方的APT包管理器轻松完成。以下是详细的步骤指南,包括从官方仓库和MySQL官方…...
Java 优化springboot jar 内存 年轻代和老年代的比例 减少垃圾清理耗时 如调整 -XX:NewRatio
-XX:NewRatio 是 Java Virtual Machine (JVM) 的一个选项,用于调整 年轻代(Young Generation)和 老年代(Old Generation)之间的内存比例。 1. 含义 XX:NewRatioN 用于指定 老年代 与 年轻代 的内存比例。 N 的含义&…...
嵌入式驱动RK3566 HDMI eDP MIPI 背光 屏幕选型与调试提升篇-eDP屏
eDP是嵌入式显示端口,具有高数据传输速率,高带宽,高分辨率、高刷新率、低电压、简化接口数量等特点。现大多数笔记本电脑都是用的这种接口。整个eDP是很复杂的,这里我们不讲底层原理,我们先掌握如何用泰山派来驱动各种…...
在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。
在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。以下是关于这两种方法的详细解释: 一、虚方法(Virtual Method) 定义:虚方法是指在运行时由实例的实际类型决定的方法。在Java中,所有的非私有、非静态、非final方法都是虚方法。当调用一个虚方法时,JVM会根据实…...
【windows】sonarqube起不来的问题解决
1. 现象与本质 因JDK的问题(比如版本太低或者太高,推荐JDK17)或者其他环境因素,导致sonarqube启动后自动关闭了。 从日志来看,根本看不出来什么,只有警告,没有ERROR,警告也不是本质问题&#…...
golang异常
panic如果不处理会导致应用进程挂掉 defer recover可以处理这种情况 一个recover只处理自己协程 产生panic的情况 空指针 数组越界 空map中添加键值对 错误,error接口,不严重 error.wrapof解决嵌套问题或者error.unwrap erroe.is方法,判断是…...
搭建MongoDB
title: 搭建MongoDB date: 2024-11-30 23:30:00 categories: - 服务器 tags: - MongoDB - 大数据搭建MongoDB 环境:Centos 7-2009 1. 创建MongoDB的国内yum源 # 下载Centos7对应最新版7.0.15的安装包 cat >> /etc/yum.repos.d/mongodb.repo << &quo…...
Android中坐标体系知识超详细讲解
说来说去都不如画图示意简单易懂啊!!!真是的! 来吧先上张图! (一)首先明确一下android 中的坐标系统: 屏幕的左上角是坐标系统原点(0,0) 原点向右延伸是X轴正…...
不需要服务器,使用netlify快速部署自己的网站
Netlify简介 1.1 Netlify的功能与特点 Netlify 是一个功能强大的静态网站托管平台,它不仅提供了简单的网站部署功能,还集成了许多现代化的开发工具和服务,帮助开发者更高效地构建、部署和管理网站。Netlify 的核心功能包括: 自动…...
Swin transformer 论文阅读记录 代码分析
该篇文章,是我解析 Swin transformer 论文原理(结合pytorch版本代码)所记,图片来源于源paper或其他相应博客。 代码也非原始代码,而是从代码里摘出来的片段,配上简单数据,以便理解。 当然&…...
信息安全概论
文章目录 预测题重要考点1.遇到什么威胁有什么漏洞怎么缓解分析题2.网络安全现状分析 2.网络安全亮点 时间信息安全概论期末简答题软件学院实验室服务器安全风险分析与PDRR策略 1.1 信息时代的特点1.2 信息安全威胁1.3信息安全趋势1.4 研究网络与信息安全的意义2.1安全风险分析…...
2024年12月16日Github流行趋势
项目名称:PDFMathTranslate 项目维护者:Byaidu reycn hellofinch Wybxc YadominJinta项目介绍:基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服务,提供 CLI/GUI/Docker。项目star数…...
Go 1.24即将到来!
Go 1.24 尚未发布。以下是正在撰写中的发布说明,预计 Go 1.24 将于 2025 年 2 月发布。 语言改进 Go 1.24 现在全面支持 泛型类型别名:类型别名可以像定义类型一样被参数化。详情请参阅语言规范。目前,可通过设置 GOEXPERIMENTnoaliastypep…...
FFmpeg库之ffplay
文章目录 FFmpeg环境搭建ffplay使用通用选项视频选项音频选项快捷键使用滤镜直播拉流 FFmpeg环境搭建 FFmpeg官网 FFmpeg环境搭建 ./configure \--prefix"$HOME/ffmpeg" \--extra-cflags"-I$HOME/ffmpeg/include" \--extra-ldflags"-L$HOME/ffmpeg…...
scala中模式匹配的应用
package test34object test6 {case class Person(name:String)case class Student(name:String, className:String)// match case 能根据 类名和属性的信息,匹配到对应的类// 注意:// 1 匹配的时候,case class的属性个数要对上// 2 属性名不需…...
WebRTC搭建与应用(一)-ICE服务搭建
WebRTC搭建与应用(一) 近期由于项目需要在研究前端WebGL渲染转为云渲染,借此机会对WebRTC、ICE信令协议等有了初步了解,在此记录一下,以防遗忘。 第一章 ICE服务搭建 文章目录 WebRTC搭建与应用(一)前言一、ICE是什么?二、什么…...
【计算机视觉基础CV】03-深度学习图像分类实战:鲜花数据集加载与预处理详解
本文将深入介绍鲜花分类数据集的加载与处理方式,同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向,为读者提供从数据组织、预处理、加载到可视化展示的完整过程,并为后续模型训练打下基础。 前言 在计算机视觉的深…...
Kafka学习篇
Architecture 系统间解耦,异步通信,削峰填谷 Topic 消息主题,用于存储消息 Partition 分区,通过扩大分区,可以提高存储量 Broker 部署Kafka服务的设备 Leader kafka主分区 Follwer kafka从分区 高性能之道:…...
冬日养仓鼠小指南:温暖与陪伴同行
随着冬日的脚步悄然来临,家中可爱的小仓鼠也需要我们给予更多的关怀与呵护。仓鼠虽小,但它们的冬日养护却大有学问,关乎着这些小生命能否健康快乐地度过寒冷季节。 保暖是冬季养仓鼠的首要任务。我们可以为仓鼠的小窝增添一些保暖材料&#…...
基于MCP协议与Graph API实现AI助手无缝集成Outlook邮箱
1. 项目概述与核心价值 最近在折腾AI工作流,发现一个挺有意思的项目: ajaya/outlook-app-mcp 。简单来说,这是一个能让你的AI助手(比如Claude Desktop、Cursor等支持MCP协议的客户端)直接读取和操作你Outlook邮箱的…...
从零打造互动徽章:激光切割与电容触摸的软硬件融合实践
1. 项目概述与核心思路如果你参加过技术大会或者创客市集,一定对那些闪烁着酷炫灯光、能与人互动的徽章印象深刻。这类被称为“Badge”的可穿戴设备,早已超越了单纯的身份标识功能,成为了展示技术、创意和社群文化的微型平台。今天要分享的&a…...
模块四-数据转换与操作——28. 分组变换与过滤
28. 分组变换与过滤 1. 概述 除了聚合(agg)之外,groupby 还支持**变换(transform)和过滤(filter)**操作。transform 用于在组内进行元素级运算,filter 用于根据组属性筛选组。 impor…...
如何设置Seal视频下载器的智能深色模式:根据时间与系统自动切换
如何设置Seal视频下载器的智能深色模式:根据时间与系统自动切换 【免费下载链接】Seal 🦭 Video/Audio Downloader for Android, based on yt-dlp 项目地址: https://gitcode.com/gh_mirrors/se/Seal Seal是一款基于yt-dlp的Android视频音频下载器…...
iOS BLE 开发(Swift 实现 + 面试 + 开发必备)
一、BLE 基础概念(必须懂) 1. BLE 是什么 Bluetooth Low Energy 低功耗蓝牙,特点:低功耗、连接快、小数据传输适用于:智能硬件、手环、车机、传感器、设备诊断2. BLE 角色Central(中心设备)&…...
2026程序员必看:收藏这份AI大模型学习资源包,小白也能轻松入门!
2026程序员必看:收藏这份AI大模型学习资源包,小白也能轻松入门! 随着AI大模型技术的快速发展,传统编程技能已难以满足职场需求。本文分析了程序员面临的职场焦虑,指出掌握大模型技术是2026年程序员提升竞争力的关键。文…...
硬件原型开发实战:从面包板到洞洞板的完整迁移指南
1. 项目概述:从概念到实物的必经之路在电子设计的漫长旅程中,从一张画满符号的电路图,到一台能稳定运行、看得见摸得着的设备,中间横亘着一道看似简单、实则至关重要的鸿沟——原型制作。这道鸿沟,就是“面包板”和“洞…...
3D模型格式转换终极方案:用stltostp轻松实现STL到STEP的专业转换
3D模型格式转换终极方案:用stltostp轻松实现STL到STEP的专业转换 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 你是否曾遇到这样的困境:3D打印的STL模型无法在专业CAD…...
Boss-Key终极指南:Windows一键隐藏窗口的完整解决方案
Boss-Key终极指南:Windows一键隐藏窗口的完整解决方案 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你是否曾在办公室突然需…...
NotebookLM生物学研究辅助落地手册(实验室已验证的7个不可公开的Prompt工程模板)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM生物学研究辅助落地手册(实验室已验证的7个不可公开的Prompt工程模板) NotebookLM 作为 Google 推出的文档感知型 AI 助手,在分子生物学、结构生物学与高通…...
