探究redis fake 方法未实现的问题原因及解决方案
1 问题描述
在使用轻量级环境的时候,偶有发现在操作一些功能的时候会报这个错,redis fake 方法未实现。
例1:物料需求计划中,初始化BOM结构树报错
kd.mmc.mrp.exception.MRPBizException: root: kd.bos.exception.KDException: redis fake 方法未实现 at kd.bos.fake.redis.JedisClientFake.hset(JedisClientFake.java:998) at kd.mmc.mrp.framework.cache.MRPRedisStore.mapSet(MRPRedisStore.java:255) at kd.mmc.mrp.framework.cache.MRPCacheManager.putSubData(MRPCacheManager.java:102) at kd.mmc.mrp.calcnode.framework.mq.resolver.query.AbstractMRPResDataQueryResolver.saveDatas(AbstractMRPResDataQueryResolver.java:71) at kd.mmc.mrp.calcnode.framework.mq.resolver.query.MRPBOMDataQueryResolver.saveDatas(MRPBOMDataQueryResolver.java:34) at kd.mmc.mrp.calcnode.framework.mq.resolver.query.AbstractMRPResDataQueryResolver.execute(AbstractMRPResDataQueryResolver.java:48) at kd.mmc.mrp.calcnode.framework.mq.resolver.query.MRPBOMDataQueryResolver.execute(MRPBOMDataQueryResolver.java:16) at kd.mmc.mrp.calcnode.framework.thread.MRPCalcWorker.run(MRPCalcWorker.java:242) at kd.mmc.mrp.calcnode.framework.thread.MRPCalcWorker.resolveAlone(MRPCalcWorker.java:55)
例2:财务应付单下推付款申请单并下推付款单,无法自动结算,通过分布式事务排查到这个报错
2024-04-17 16:07:01.335 ERROR --- [IdempotentWatchDog/traceId:da16ab70177dbbe7/time:1713340621310] k.b.k.c.i.s.IdempotentRedisStorageImpl : {traceId:1220a1e4825ef3dd} redis renewal err IDEM:ierp:1565321489509515264:1713169793618 kd.bos.exception.KDException: redis fake 方法未实现 at kd.bos.fake.redis.JedisClientFake.pexpire(JedisClientFake.java:305) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at kd.bos.redis.JedisClientProxy.invoke(JedisClientProxy.java:37) at com.sun.proxy.$Proxy21.pexpire(Unknown Source) at kd.bos.kdtx.common.idemponent.storage.IdempotentRedisStorageImpl.renewal(IdempotentRedisStorageImpl.java:123) at kd.bos.kdtx.common.idemponent.watchdog.IdempotentWatchDog.renewalByDBRoute(IdempotentWatchDog.java:88) at kd.bos.kdtx.common.idemponent.watchdog.IdempotentWatchDog.renewal(IdempotentWatchDog.java:82) at kd.bos.kdtx.common.idemponent.watchdog.IdempotentWatchDog.run(IdempotentWatchDog.java:64) at kd.bos.threads.impl.RequestContextRunnable.run(RequestContextRunnable.java:59) at kd.bos.thread.ThreadLifeCycleManager$RunnableWrap.run(ThreadLifeCycleManager.java:267) at java.lang.Thread.run(Thread.java:748)
例3:在某个版本的标准的引入引出功能不能使用报错
Caused by: kd.bos.exception.KDException: KDException: redis fake 方法未实现:[eval][keys=>679008189806542848IDGEN_SIGNER_CURSEQ_bas/coderule/26QTTKS0UGW+] at kd.bos.cache.redis.RedisSessionlessCache.eval(RedisSessionlessCache.java:237) at kd.bos.generator.common.cache.DistributeCacheUtil.lua(DistributeCacheUtil.java:87) at kd.bos.generator.segment.SignerCache.updateCurseqIfCompare(SignerCache.java:144) at kd.bos.generator.segment.SegmentConfig.updateCurseq(SegmentConfig.java:351) at kd.bos.coderule.adaptor.FastCodeRuleSigner.updateMaxNumber(FastCodeRuleSigner.java:332) at kd.bos.coderule.service.CodeRuleServiceImp.updateNumber(CodeRuleServiceImp.java:2245) at kd.bos.coderule.service.CodeRuleServiceImp.updateMaxserialNumbers
2 原因分析
首先要说明的一点是,这个问题是只发生在轻量级环境上的,而轻量级环境是供广大苍穹开发者安装在个人电脑上一套“学习版”的环境,为了让这套环境便于在相对配置较低的个人电脑上运行,轻量级环境相比gPaaS容器版环境少了不少组件,比如说monitor,redis,mq,以及文件服务器等组件。而苍穹的不少功能都是依赖于redis缓存的,所以在轻量级环境就用了一种替代的方式来实现,这种方式就是通过jvm内存式存储(可以简称为redis fake)来实现的。
而这种是和真正redis,还是有区别的,redis的分布式集群,lua脚本,持久化的这些特性都是没有在苍穹轻量级的内存(redis fake)实现的,所以当一些业务功能使用redis的时候会报以上的错,如例2的pexpire方法在redis里面实现了,而在redis fake是没有实现的。下面的截图是pexpire方法被调用直接报异常,redis fake 方法未实现。
当然随着版本的更迭,redis fake也在不断适配这些功能,像上面的以上1,3两种报错都在苍穹6.0通过补丁实现了,也就不会再报这种错误了。
3 解决方案
如果是旧版本的轻量级环境可以通过下载最新版本的轻量化环境,也就是开发者助手,里面包含了最新版的redis fake 的适配,下面是相关文档。
如果最新版依然有问题,可以通过提单或者在评论区留言,我会联系你们。
探究redis fake 方法未实现的问题原因及解决方案
本文2024-09-23 01:14:55发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144734.html