其实问题很简单,我广播出去的时候是传输的对象
//单节点实现方式,如果是单节点建议使用该方式,如果是分布式部署废弃该方式
Boolean sendFlag = webMessageHandler.sendMessageToUser(message);
if(!sendFlag) {//发送失败广播出去,让其他节点发送
redisTemplate.convertAndSend(Constant.WEB_MESSAGE,message);
}
接收的时候也是对象接收的
@Override
public void receiveMessage(WSMessage message) {
boolean flag = sendMessageToUser(message);
if(flag) {
logger.info("发送消息成功!");
}
}
但是这种序列化对象的传输就是接收不到参数,后来修改为JSON字符串传输
Boolean sendFlag = webMessageHandler.sendMessageToUser(message);
if(!sendFlag) {//发送失败广播出去,让其他节点发送
redisTemplate.convertAndSend(Constant.WEB_MESSAGE,JSONObject.toJSONString(message));
}
接收采用字符串接收
@Override
public void receiveMessage(String message) {
logger.info("开始发送消息!"+message);
message = message.substring(1, message.length()-1);
logger.info(message);
message = message.replaceAll("\\\\", "");
logger.info(message);
boolean flag = sendMessageToUser(JSONObject.parseObject(message, WorkBenchMessage.class));
logger.info("发送消息的结果"+flag);
if(flag) {
logger.info("发送消息成功!");
}
}
这里又遇到一个小坑,就是直接对message进行Object的转换的时候会报错,因为redis在处理json字符串的时候会自动加上转义字符。导致parseObject失败。这里的处理方式是去掉前后的""然后替换转义符号。
注意在替换转义的符号的需要使用"\\\\"替换一个"\"
message = message.replaceAll("\\\\", "");