项目场景:
项目使用了两套框架:JFINAL、spring;当着两套框架的服务共用一个redis服务来做二级缓存时。
问题描述
redis的广播消息出现不兼容的情况,导致服务日志一直打印广播消息解析失败的一异常,同时会导致两边的二级缓存数据不一致
![在这里插入图片描述](https://img-blog.csdnimg.cn/55e905401e6d41e288d3dd6ac66bc0d2.png#pic_center)
原因分析:
提示:这里填写问题的分析:
spring框架的redis二级缓存广播的消息是json字符串的字符串,
redis广播json="{\"keys\":[\"43106eb21c6e3718b5361655d45a1a9a\"],\"operator\":2,\"region\":\"accessToken\",\"src\":1938105}"
jfinal使用的oschina的redis二级缓存json字符串
redis广播json={"keys":["43106eb21c6e3718b5361655d45a1a9a"],"operator":2,"region":"accessToken","src":1938105}
解决方案:
提示:这里填写该问题的具体解决方案:
1、在项目/src/main/java内新建目录net.oschina.j2cache包,复制net.oschina.j2cache jar包内的Command类到此目录
2、修改net.oschina.j2cache.Command类的json()、parse()方法,覆盖jar包内的类
public String json() {
String jsonStr = null;
try {
Map<String, String> map = new HashMap<>();
map.put("JSON", JSON.toJSONString(this));
ObjectMapper objectMapper = new ObjectMapper();
jsonStr = objectMapper.writeValueAsString(map.get("JSON"));
}catch (Exception e) {
e.printStackTrace();
}
LogKit.info("redis广播json=%s", jsonStr);
return jsonStr;
}
public static Command parse(String json) {
try {
if (json != null) {
String newJson = StringEscapeUtils.unescapeJava(json);
if (newJson != null) {
newJson = newJson.replace("\"\"", "\"");
}
return (Command) Jackson.getJson().parse(newJson, Command.class);
}else {
return null;
}
} catch (JSONException var2) {
return null;
}
}
3、java -cp命令启动项目的可能出现覆盖失败的情况,java -cp指定class加载顺序,优先加载主服务jar包
CP=${APP_BASE_PATH}/conf:${APP_BASE_PATH}/mainlib/console-server-1.0.0.jar:${APP_BASE_PATH}/lib/*