/** * 解析从数据库获取的二进制data数据 * * @param messageEntity */ private void readMessageContentFromDB(MessageEntity messageEntity, MessageVO messageVO) { try { //从数据库t_messages_x表中读取到消息内容字段_data的二进制数据为 byte[] data = messageEntity.getData(); //1. 先把二进制数据转化为协议栈消息内容。 WFCMessage.MessageContent protoContent = null; protoContent = WFCMessage.MessageContent.parseFrom(data); //2. 调用MessageContentFactory接口解析为消息内容。 MessageContent messageContent = MessageContentFactory.decodeMessageContent(protoContent); //3. 检查是哪种消息,如果没有定义,会回落到UnknownMessageContent。自定义消息看本函数最后的注释。 if (messageContent instanceof TextMessageContent) { // 文本消息 TextMessageContent txt = (TextMessageContent) messageContent; messageVO.setType(1); messageVO.setText(txt.getText()); } else if (messageContent instanceof ImageMessageContent) { // 图片消息 ImageMessageContent img = (ImageMessageContent) messageContent; messageVO.setType(3); messageVO.setRemoteMediaUrl(img.getRemoteMediaUrl()); } else if (messageContent instanceof FileMessageContent) { // 附件消息 FileMessageContent file = (FileMessageContent) messageContent; messageVO.setFileName(file.getName()); messageVO.setFileSize(file.getSize()); messageVO.setType(5); messageVO.setRemoteMediaUrl(file.getRemoteMediaUrl()); } else if (messageContent instanceof VideoMessageContent) { // 视频消息 VideoMessageContent video = (VideoMessageContent) messageContent; messageVO.setType(6); messageVO.setRemoteMediaUrl(video.getRemoteMediaUrl()); } } catch (Exception e) { LOG.error("An error occurred:", e); } }
##是否数据库中加密消息内容。注意这个开关在服务运行起来后不能改变了,避免读取数据库时无法恢复历史消息。 ##如果要避免数据库中明文存储消息内容,请打开这个开关和message.disable_remote_search开关 message.encrypt_message_content false ##消息内容加密密钥,至少32位。 message.encrypt_key 5e94ecdeab9d4ca19b9a585f4bf0afd6
wenzhouh 走到了这里MessageContent messageContent = MessageContentFactory.decodeMessageContent(protoContent); 打印的结果 ...
wenzhouh 嗯,我们自己打的,它没有报错,就是没有任何匹配。后面我加了个打印日志的,else if (messageContent instanceof VideoMessageContent) { ...