【异常】com.alicp.jetcache.CacheException: refresh error

news2024/11/20 12:39:50

jetcache refresh error

  • 一、背景描述
  • 二、报错内容
  • 三、报错原因
  • 四、解决方案
    • 4.1 解决方案一,使用一级缓存
    • 4.2 解决方案二,开启写入权限

一、背景描述

技术栈:Spring Boot(2.1.5.RELEASE) + Spring Cloud
Oopenfeign(2.1.1.RELEASE) + jetCache(2.5.14) + redis(3.1.0)

由于项目使用了微服务架构,各个服务职责不同,又相互引用,所以就经常在服务A中调用服务B的接口,我们使用的是Feign客户端,即 FeignClient。通过接口调用返回的数据,在服务A中先进行了缓存(使用了JetCache),减少对服务B的频繁调用,减轻服务B的压力。

由于 jetCache 可以使用两级缓存(本地缓存 + 远程缓存),所以在代码中便开启了两级缓存,本地缓存(内存中)数量限制为50个,远程缓存(redis)不限制数量。

使用两个注解就可以实现添加缓存和刷新缓存。分别是 @Cached 添加缓存,@CacheRefresh 刷新缓存,如果开启两级缓存,那么两级缓存都会刷新,如果只有一级缓存,那么只会缓存一级缓存。

缓存时间为30分钟,每60秒对缓存进行刷新一次。于是代码如下:

package com.iot.back.message.process.rpc;

import com.alicp.jetcache.anno.CacheRefresh;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.Cached;
import com.iot.basic.iotsmarthome.api.client.floor.FloorClient;
import com.iot.framework.core.response.CommResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * <p>FloorClientRpc 此类用于:调用基础家居服务楼层相关接口 </p>
 * <p>@author:hujm</p>
 * <p>@date:2022年07月20日 14:18</p>
 * <p>@remark:</p>
 */
@Slf4j
@Component
public class FloorClientRpc {

    @Resource
    FloorClient floorClient;

    @Cached(name = "back-process-service:jetCache:singleFloor:", expire = 30, timeUnit = TimeUnit.MINUTES, cacheType = CacheType.BOTH, localLimit = 50)
    @CacheRefresh(refresh = 60)
    public Boolean singleFloor(String sn) {

        CommResponse<Boolean> commResponse = floorClient.singleFloor(sn);
        if (commResponse == null || commResponse.isFail()) {
            log.error("P0|FloorClientRpc|singleFloor|调用基础家居服务时,根据【sn = {}】获取当前家庭是否为单楼层失败!", sn);
            return null;
        }

        return commResponse.getData();
    }
}

出现的现象是在本机的电脑上(Windows 10)跑代码,刷新缓存正常,也不报错。部署到服务器上(Linux )就会报刷新缓存错误的问题。

二、报错内容

[2022-11-22 16:38:59 ERROR com.alicp.jetcache.RefreshCache.run(RefreshCache.java:257) JetCacheHeavyIOExecutor5   :] refresh error: key=[Ljava.lang.Object;@1f4c18af
com.alicp.jetcache.CacheException: refresh error
	at com.alicp.jetcache.RefreshCache$RefreshTask.lambda$externalLoad$0(RefreshCache.java:207)
	at com.alicp.jetcache.Cache.tryLockAndRun(Cache.java:272)
	at com.alicp.jetcache.RefreshCache$RefreshTask.externalLoad(RefreshCache.java:212)
	at com.alicp.jetcache.RefreshCache$RefreshTask.run(RefreshCache.java:252)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: null

在这里插入图片描述

三、报错原因

根据报错内容,查看源码后得知是 key 为空,发生了空指针异常。源码如下图所示:
在这里插入图片描述

这一行代码唯一可能为空的就是 lockKey,只有这里可能会发生空指针

使用 jetCache 之后,就开启了两级缓存(本地缓存 + 远程缓存)即在 @Cached 注解上添加了 cacheType = CacheType.BOTH 这个属性。开启了两级缓存,那么使用 @CacheRefresh 注解,会使两级缓存都进行刷新。

在Windows电脑上使用的是管理员用户,可以向本地缓存中写数据,所以在本机上运行代码不会报错,而程序部署到服务器上,由于不是超管账户所以没有向本地缓存中写入数据的权限,导致服务器上的本地缓存没有数据。而使用 refreshCache 注解之后,它是根据缓存数据中的 key 来刷新缓存的,由于服务器本地电脑并没有成功保存数据,而导致没有查到这个 key ,所以会才报 keyNPE(NullPointerException)

四、解决方案

知道了上述原因之后,对应的就会出现两种解决方案,第一种就是把本地缓存关了,只使用远程缓存;第二种就是把服务器上的写入本地缓存的权限放开。

4.1 解决方案一,使用一级缓存

@Cached 注解上修改 cacheType = CacheType.BOTHcacheType = CacheType.REMOTE,并把 localLimit 属性删除,仅使用远程缓存,不使用本地缓存,修改过后再把代码部署到服务器上之后,刷新缓存时不再报错。已经验证可以使用。

4.2 解决方案二,开启写入权限

让运维工程师把写入本地缓存的权限放开。这个由于没有验证,只是理论上可行。有条件的可以验证一下。

完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于nodejs电商购物系统的设计与实现(论文+源码+ppt文档+视频录制)

资料下载地址&#xff1a;请点击》》》》 1 前言 2 1.1课题背景 2 1.2课题内容 3 2 需求分析 4 2.1 功能需求 4 2.2 性能需求 5 系统安全性 5 系统数据完整性 5 2.3 数据需求 6 2.4 运行环境需求 6 客户端配置 6 服务器配置 6 2.5 nodejs框架分析 6 3 系统设计 7 3.1 系统设计…

软件项目管理期中准备(自用,仅供参考)

考前拿到了样卷(#^.^#) 直接面向样卷备考 软件项目管理期中准备&#xff08;自用&#xff0c;仅供参考&#xff09;选择题计算题1.进度管理-关键路径法&#xff0c;时间压缩法2.进度管理-任务历时估计3.成本管理-COCOMO估算法4.项目的执行与控制-挣值分析法5.成本管理-专家估算…

数据库-----JDBC技术

JDBC概述 数据的持久化 持久化(persistence)&#xff1a;将内存中的数据保存到可永久保存的存储 设备中&#xff08;如磁盘&#xff09;。 持久化的主要应用是将内存中的数据存储在关系型数据库中&#xff0c;当 然也可以存储在磁盘文件、XML数据文件中。 什么是 JDBC 1、JDBC…

DIN EN ISO 4589-2塑料 用氧指数法测定燃烧行为 第2 部分:室温试验

ISO 4589-2 塑料-用氧指数法测定燃烧行为-第2部分:室温测试&#xff0d;标准名称&#xff1a; ISO 4589-2 塑料-用氧指数法测定燃烧行为-第2部分:室温测试 ISO 4589-2 Plastics-Determination of burning behaviour by oxygen index –Part 2: Ambient-temperature test ISO 4…

推荐10个不错的React开源项目

1&#xff0c;Kutt.it Kutt是一个现代的URL缩短器&#xff0c;支持自定义域&#xff0c;可以用来缩短网址、管理链接并查看点击率统计信息。Kutt支持自定义域名&#xff0c;设置链接密码和描述&#xff0c;缩短URL的私人统计信息&#xff0c;查看、编辑、删除和管理链接&#…

LPWA物联网通信

物联网LPWA是物联网中的无线通信技术之一。 根据物联网无线通信技术的覆盖距离&#xff0c;大致可分为两类&#xff1a;一类是短距离通信技术&#xff0c;包括蓝牙(蓝牙)&#xff1b;NFC,Zigbee、WIFI、NFC&#xff0c;主要用于室内智能家庭、消费电子等场景&#xff1b;另一种…

C++异常

21 C异常 21.1 什么时候会发生异常 1.打开一个不存在的文件 2.请求存储空间失败 3.数组越界等等 21.2 使用abort()函数 1.包含在cstdlib头文件中&#xff0c;包含在std命名空间中 2.当调用abort()函数时&#xff0c;会引发异常并中断程序(Visual Studio 2019)&#xff1b;…

【PlasticSCM Could Edition】新版本云托管浅试 (与踩一些坑)

【PlasticSCM Could Edition】新版本云托管浅试前言尝试对比前言 UnityHub 3.3.0-c7 中&#xff0c;下载了一个 2021LST 的版本&#xff0c;毕竟为了做毕设&#xff0c;用 2020LST 的感觉老了点… 然后新建了一个项目&#xff0c;勾选使用 版本控制 &#xff0c;但是报错 那先…

【附源码】计算机毕业设计JAVA药品管理系统

【附源码】计算机毕业设计JAVA药品管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

STM32CubeMX学习笔记(48)——USB接口使用(MSC基于外部Flash模拟U盘)

一、USB简介 USB&#xff08;Universal Serial BUS&#xff09;通用串行总线&#xff0c;是一个外部总线标准&#xff0c;用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、…

HTTP —— HTTP 响应详解, 构造 HTTP 请求

JavaEE传送门JavaEE 【前端】JavaScript —— WebAPI HTTP —— HTTP 协议中的细节(超详细!!) 目录HTTP 响应详解认识 "状态码"状态码小结认识响应 "报头" headerContent-Type认识响应 "正文" body构造 HTTP 请求form 表单ajaxpostmanHTTP 响应…

API接口怎么使用(教你使用api接口获取数据)

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…

【Linux】常见指令汇总

每个优秀的人&#xff0c;都有一段沉默的时光。 那段时光&#xff0c;是付出了很多努力&#xff0c;却得不到结果的日子&#xff0c;我们把它叫做扎根。 文章目录一、xshell的介绍操作系统1.1 xshell1.2 操作系统二、Linux下基本指令2.1 ls(显示当前目录下的文件列表&#xff…

【IVIF:引入注意力机制:GAN:双鉴别器】

AttentionFGAN: Infrared and Visible Image Fusion Using Attention-Based Generative Adversarial Networks &#xff08; AttentionFGAN&#xff1a;使用基于注意的生成对抗网络进行红外和可见光图像融合&#xff09; 在本论文中&#xff0c;我们将多尺度注意机制集成到GAN…

redis优化与一些问题

文章目录优化采用SSD硬盘-提升磁盘读写的速度控制 redis 的内存在10G以内&#xff0c;防止fork耗时太长fork 注意事项设置内存淘汰策略vm.overcommit_memory1尽可能地使用 hash 哈希存储参数调优swapinessulimitTCP backlog客户端缓冲优化碎片优化问题缓存与数据库数据不一致将…

换个地方写helloworld

1、Linux中I/O讲解 今天&#xff0c;我们重新学习C语言的基础&#xff0c;特别是I/O口的讲解。 所谓标准 I/O 库则是标准 C 库中用于文件 I/O 操作&#xff08;譬如读文件、写文件等&#xff09;相关的一系列库函数的集合&#xff0c;通常标准 I/O 库函数相关的函数定义都在头…

实时输出Java8 HashMap数据结构

看过 Java 8 HashMap 源码的知道底层数据结构是数组、链表和红黑树实现的&#xff0c;从Debug调试或者序列化输出的都是K,V值&#xff0c;没法直观的看到上述的数据结构&#xff0c;为了直观的看到数据结构存储方面的变化&#xff0c;本文通过动图演示HashMap的结构变化。 为了…

【6 - 完结】Sql Server - 郝斌(identity、视图、事务、索引、存储过程、触发器、游标、TL_SQL)

课程地址&#xff1a;数据库 SQLServer 视频教程全集&#xff08;99P&#xff09;| 22 小时从入门到精通_哔哩哔哩_bilibili ​ 目录 identity&#xff08;主键自动增长&#xff0c;用户不需要为identity修饰的主键赋值&#xff09; 用法 如何重新设置identity字段的值 如…

从React源码来学hooks是不是更香呢

本文将讲解 hooks 的执行过程以及常用的 hooks 的源码。 hooks 相关数据结构 要理解 hooks 的执行过程&#xff0c;首先想要大家对 hooks 相关的数据结构有所了解&#xff0c;便于后面大家顺畅地阅读代码。 Hook 每一个 hooks 方法都会生成一个类型为 Hook 的对象&#xff…

wpf布局学习二 wpf xaml 与android xml界面对比, C++图片旋转与缩放好复杂放弃

弄不明白的事&#xff0c;还是不要去做。 没懂清楚原理&#xff0c;不要尝试去修改。浪费时间。 wpf布局学习二 <Window x:Class"WpfM20UpdateFW.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sch…