readMessageContentFromDB解析数据库中的消息,本地测试还能解析的,部署到测试环境,就解析不了,想问下,这是有啥配置吗?

wenzhouh 2天前 64

/**
 * 解析从数据库获取的二进制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);
    }
}
最新回复 (20)
  • wenzhouh 2天前
    引用 2
    readMessageContentFromDB 解析Data数据失败 messageContent: {"contentType":1,"persistFlag":3}, 全是这种返回
  • x86 1天前
    引用 3
    readMessageContentFromDB 这个函数,是走到了,什么地方?
  • wenzhouh 1天前
    引用 4
    走到了这里MessageContent messageContent = MessageContentFactory.decodeMessageContent(protoContent); 打印的结果是这个messageContent: {"contentType":1,"persistFlag":3}
  • wenzhouh 1天前
    引用 5
    测试环境数据库的那些消息数据我看跟我本地的没啥区别呀,明明本地还可以的,部署到测试环境就解析不了。
  • HeavyRain 1天前
    引用 6
    有没有可能是线上环境开启了消息内容加密
  • wenzhouh 1天前
    引用 7
    请问是哪个配置呀,我改下试试,不清楚线上有没有开启这个消息内容加密
  • x86 1天前
    引用 8
    ##是否数据库中加密消息内容。注意这个开关在服务运行起来后不能改变了,避免读取数据库时无法恢复历史消息。
    ##如果要避免数据库中明文存储消息内容,请打开这个开关和message.disable_remote_search开关
    message.encrypt_message_content false
    
    ##消息内容加密密钥,至少32位。
    message.encrypt_key 5e94ecdeab9d4ca19b9a585f4bf0afd6
  • wenzhouh 1天前
    引用 9
    不是这个原因,我检查了测试环境的配置,就是这个没加密的。
  • wenzhouh 1天前
    引用 10
    ##是否禁止服务器端消息搜索,该功能暂未实现。目前的影响是如果打开,则存储消息时不单独保存_searchable_content字段
    message.disable_remote_search  false

    ##是否数据库中加密消息内容。注意这个开关在服务运行起来后不能改变了,避免读取数据库时无法恢复历史消息。
    ##如果要避免数据库中明文存储消息内容,请打开这个开关和message.disable_remote_search开关
    message.encrypt_message_content false

    ##消息内容加密密钥,至少32位。或者不配置,IM服务会有默认加密方法。注意不能动态切换,请在正式运行前确认加密及密钥。
    #message.encrypt_key 5e94ecdeab9d4ca19b9a585f4bf0afd6
  • wenzhouh 1天前
    引用 11
    请问还有可能是啥原因引起的呀?
  • x86 1天前
    引用 12
    wenzhouh 走到了这里MessageContent messageContent = MessageContentFactory.decodeMessageContent(protoContent); 打印的结果 ...
    这个错误是不是你们自己打印的,不是原始错误?我看了一下,不会打印这个错误信息呀
  • wenzhouh 1天前
    引用 13
    嗯,我们自己打的,它没有报错,就是没有任何匹配。后面我加了个打印日志的,else if (messageContent instanceof VideoMessageContent) {
                    // 视频消息
                    VideoMessageContent video = (VideoMessageContent) messageContent;
                    messageVO.setType(6);
                    messageVO.setRemoteMediaUrl(video.getRemoteMediaUrl());
                } else {
                    LOG.info("=========== readMessageContentFromDB 解析Data数据失败 messageContent: {} ===========", JSONObject.toJSONString(messageContent));
                }
  • wenzhouh 1天前
    引用 14
    数据我都从数据库拿到了,但是就是解析不出来,全部走了else 这个逻辑,打印的全是这个messageContent: {"contentType":1,"persistFlag":3}
  • wenzhouh 1天前
    引用 15
    引入的sdk是1.3.5的
                   <wfc.sdk.version>1.3.5</wfc.sdk.version>
                   <dependency>
                           <groupId>cn.wildfirechat</groupId>
                           <artifactId>sdk</artifactId>
                           <version>${wfc.sdk.version}</version>
                           <scope>system</scope>
                           <systemPath>${project.basedir}/src/lib/sdk-${wfc.sdk.version}.jar</systemPath>
                   </dependency>

                   <dependency>
                           <groupId>cn.wildfirechat</groupId>
                           <artifactId>common</artifactId>
                           <version>${wfc.sdk.version}</version>
                           <scope>system</scope>
                           <systemPath>${project.basedir}/src/lib/common-${wfc.sdk.version}.jar</systemPath>
                   </dependency>
  • HeavyRain 1天前
    引用 16
    wenzhouh 嗯,我们自己打的,它没有报错,就是没有任何匹配。后面我加了个打印日志的,else if (messageContent instanceof VideoMessageContent) { ...
    messageContent解析出来是什么消息类型?
  • wenzhouh 1天前
    引用 17
    解析出来打印就是这样的呀,messageContent: {"contentType":1,"persistFlag":3}
  • wenzhouh 1天前
    引用 18
    我在测试环境将那个二进制data打印出来了,byte[] data = {
        8, 1, 18, 24, 87, 101, 32, 97, 114, 101, 32, 
        116, 104, 101, 32, 109, 97, 110, 117, 102, 97, 
        99, 116, 117, 114, 101, 114, 46, 48, 0, 64, 3, 
        72, 0, 80, 0
    };
  • wenzhouh 1天前
    引用 19
    然后,我丢到本地测试,发现它能解析出来,那为啥测试环境的不行,就很奇怪?            //1. 先把二进制数据转化为协议栈消息内容。
                WFCMessage.MessageContent protoContent = WFCMessage.MessageContent.parseFrom(data);
                //2. 调用MessageContentFactory接口解析为消息内容。
                MessageContent messageContent = MessageContentFactory.decodeMessageContent(protoContent);
  • wenzhouh 1天前
    引用 20
    所以问题是不是这个解析的 WFCMessage.MessageContent.parseFrom,这里的问题?
  • wenzhouh 1天前
    引用 21
    问题解决了:1 WFCMessage类不能混淆,如果混淆 WFCMessage.MessageContent.parseFrom(data)就会失败。//2 MessagecontentFactory方法会自动查找所有的消息类,包括文本/图片等。也有可能在某些环境下找不到这些类。可以检查MessagecontentFactory//类的源码,修改registerAllMessagecontent方法,确保能找到所有的内容类。也可以显式调用注册的方法把所有已知消息都注册一遍,比如://MessageContentFactory.registerCustomMessagecontent(TextMessageContent.class);//等等其他消息
返回