您的位置:首页 > 健康 > 美食 > 怎么开网店详细步骤教程_吉林测试网站建设检修_直通车关键词怎么优化_专业北京seo公司

怎么开网店详细步骤教程_吉林测试网站建设检修_直通车关键词怎么优化_专业北京seo公司

2024/12/23 22:09:18 来源:https://blog.csdn.net/themagickeyjianan/article/details/144577746  浏览:    关键词:怎么开网店详细步骤教程_吉林测试网站建设检修_直通车关键词怎么优化_专业北京seo公司
怎么开网店详细步骤教程_吉林测试网站建设检修_直通车关键词怎么优化_专业北京seo公司

一、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);});}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com