当前位置: 首页 > news >正文

网站中图片下移怎么做中小型网站建设方案

网站中图片下移怎么做,中小型网站建设方案,株洲市建设网站,小公司网站前言 无论是kafka&#xff0c;还是RocketMq&#xff0c;消费者方法参数中的MessageExt对象不能被 fastjson默认的方式序列化。 一、查看代码 Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {t…

前言

  无论是kafka,还是RocketMq,消费者方法参数中的MessageExt对象不能被 fastjson默认的方式序列化。

一、查看代码

@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {try {GiftSendMessage message = JSON.parseObject(msgs.get(0).getBody(),GiftSendMessage.class);UserInfo userInfo = new UserInfo();userInfo.setMemberId(String.valueOf(message.getFromId()));userInfo.setScId(message.getScId());userInfo.setAnchorScid(message.getAnchorScid());userInfo.setAnchorId(message.getAnchorId());userInfo.setGiftSendToId(message.getToId());DrawByGiftSendConfig draw =filter.getGiftIdBySend().get(String.valueOf(message.getGiftId()));GiftSendRequest request = new GiftSendRequest();request.setActivityId(draw.getActivityId());request.setBoxType(draw.getBoxType());request.setGiftOrderId(message.getGiftOrderId());request.setBatch(message.getAmount());request.setSendTime(message.getSendTime());request.setUserInfo(userInfo);request.setPaymentVersion(PAYMENT_VERSION);this.userDrawService.giftSend(request);LOG.info("DRAW BY GIFT SEND WITH SANTA CHECKOUT, MQ-MESSAGE={}, REQUEST={}",JSON.toJSONString(message),JSON.toJSONString(request));} catch (Exception e) {LOG.error("GIFT-SEND-QUEUE CONSUME FATAL ERROR ON PARSING, DROPPED, MSG={},EXCEPTION={}, EXCEPTION-MESSAGE={}",JSON.toJSONString(msgs), e.getClass().getSimpleName(),e.getMessage(), e);} return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}

二、问题代码

在这里插入图片描述

三、原因分析

  上图中红色方框当中,用的序列化方式为 fastjson,此行代码会抛出异常,导致消费失败,进入重试队列,且没有任何业务日志输出。MQ源码如下:
在这里插入图片描述
如果异常,返回 ConsumeConcurrentlyStatus.RECONSUME_LATER;

结论:无论是kafka,还是RocketMq,消费者方法参数中的MessageExt对象不能被 fastjson默认的方式序列化。

环境:项目采用1.2.31 (最新版本1.2.78)
接下来,我们分析下fastjson序列化的完整过程:
fastjson反序列化的方式默认为采用 get方法、is方法作为序列化属性 字段的,序列化流程如下:
在这里插入图片描述
其中:在获取对象序列化的时候,MessageExt中有返回 ByteBuffer的get方法,代码如下:

public ByteBuffer getStoreHostBytes() {return socketAddress2ByteBuffer(this.storeHost);
} 
//socketAddress2ByteBuffer
public static ByteBuffer socketAddress2ByteBuffer(SocketAddress socketAddress) {ByteBuffer byteBuffer = ByteBuffer.allocate(8);return socketAddress2ByteBuffer(socketAddress, byteBuffer);
}
//socketAddress2ByteBuffer
public static ByteBuffer socketAddress2ByteBuffer(SocketAddress socketAddress, ByteBuffer
byteBuffer) {InetSocketAddress inetSocketAddress = (InetSocketAddress)socketAddress;byteBuffer.put(inetSocketAddress.getAddress().getAddress(), 0, 4);byteBuffer.putInt(inetSocketAddress.getPort());byteBuffer.flip();return byteBuffer;
}

Mq消息在接收到消息时,构造了返回了ByteBuffer对象的方法,该方法是nio中设计用于保存数据到缓冲区的目的。

3.1 ByteBuffer主要的属性,与fastjson的get方法反序列化方式

  • position: 其实是指从buffer读取或写入buffer的下一个元素位置。比如,已经写入buffer 3个元素那那么position就是指向第4个位置,即position设置为3(数组从0开始计);
  • limit:还有多少数据需要从buffer中取出,或还有多少空间可以放入;postition总是<=limit;
  • capacity: 表示buffer本身底层数组的容量。limit绝不能>capacity;

数据结构如下:
在这里插入图片描述

  • get()方法,一字节一字节读;
  • getChar()、getShort()、getInt()、getFloat()、getLong()、getDouble()读取相应字节数的数据;

3.2 最终原因分析得到

  至此:问题显而易见,fastjson在1.2.31及之前,没有提供ByteBuffer 序列化器,所以用了默认的javabean序列化器,而默认的javabean序列化器,又通过get方法反序列化,当遇见ByteBuffer时,ByteBuffer中会先遇到如下方法,getLong():

public long getLong() {return Bits.getLong(this, ix(nextGetIndex(8)), bigEndian);
} //nextGetIndex
final int nextGetIndex(int nb) { // package-privateif (limit - position < nb)throw new BufferUnderflowException();int p = position;position += nb;return p;
}

每次读取position偏移8个字节,而MessageExt中,构建的ByteBuffer存储的时4个字节,所以会报错,完整的堆栈如下:
在这里插入图片描述

四、总结

  1. fastjson 序列化需注意问题,不能序列化RocketMq工具类中MessageExt对象,会报错;
  2. 原因:MessageExt包含ByteBuffer类型的nio包对象,而低版本fastjson没有该类型序列化器(JavaBeanSerializer),使用默认的序列化器;
  3. ByteBuffer中getLong方法,getLong方法的position偏移8个字节,而MessageExt中,构建的ByteBuffer存储的时4个字节,所以会BufferUnderflowException异常。
  4. BufferUnderflowException异常:表示在读取缓冲区时发生了下溢(underflow)的情况。下溢是指尝试从缓冲区中读取比可用数据量更多的数据;
  5. 无论是kafka,还是RocketMq,消费者方法参数中的MessageExt对象不能被 fastjson默
    认的方式序列化;
http://www.yayakq.cn/news/524372/

相关文章:

  • 嘉兴本地推广网站有哪些关于水果怎么做网站
  • 济宁网站建设公司有哪些wordpress提醒用法
  • 科技企业网站建设模板珠海网站建设那家好
  • 设计部联盟网站去了外包公司就毁了吗
  • 建设网站 目标怎么做网页啊
  • 网站制作与网站设计益阳建设厅网站
  • 上海网站搜索优化北京网站建设排名
  • 免费做淘宝客网站石家庄抖音优化
  • 手机好看网站模板咋制作网站
  • 做一个商城网站今天刚刚发生的重大新闻
  • 天津市武清区建设银行网站wordpress哪个版本稳定
  • 好的做网站的公司国美网上商城
  • 网站开发流程6个阶段深圳建筑业网站建设
  • 百度收录哪些网站移动应用开发心得体会
  • 帮你省网站怎么做设计本app下载
  • 网站建设找超速云建站网络优化大师app
  • 网站策划与建设实训心得福州推广企业网站
  • 做网站的基础wordpress 主题 修改
  • 爱做网站软件网站从哪几个方面维护
  • 在百度搜索到自己的网站中国诚乡建设部网站
  • 开封淘宝网站建设想做机械加工和橡胶生意怎么做网站
  • 企业网站外包建设建设职业注册中心网站
  • 用层做的网站展厅设计公司有哪些
  • 陶瓷网站策划书天津市网站建设天津商城建设
  • dz论坛可以做商业网站邢台市有几个区几个县
  • 一起做业网站app大全免费软件排行榜
  • 上海集团网站建设咨询wordpress 七牛视频
  • 腾讯云怎么做网站内江规划建设教育网站
  • 如何做国外的电商网站设计定制头像的网站
  • 做的最好的微电影网站有哪些海南网站建设哪里有