厦门网站快照优化公司,网络服务器设备,企业网络营销策略研究,百度联盟点击广告赚钱前言
这两天学习Moquette#xff0c;对ByteBuf做了点研究#xff0c;对于maxCapacity有了进一步了解。
一、ByteBuf是什么#xff1f;
最早是在netty中有接触#xff0c;这算是是核心了#xff0c;有很多文章进行介绍#xff1a;
Netty(7)源码-ByteBufJava ByteBuf 写…前言
这两天学习Moquette对ByteBuf做了点研究对于maxCapacity有了进一步了解。
一、ByteBuf是什么
最早是在netty中有接触这算是是核心了有很多文章进行介绍
Netty(7)源码-ByteBufJava ByteBuf 写数据 java bytebuf类
二、如何改变ByteBuf里面的内容
1.读取
读取方式有很多比如读取成String
String payload msg.payload().toString(StandardCharsets.UTF_8);或者直接读取成byte[]
byte[] bytes read(msg.payload());public static byte[] read (ByteBuf datas) {byte[] bytes new byte[datas.readableBytes()];datas.readBytes(bytes);return bytes;
}2.改写
处理完毕读出来的数据如何才能将处理好的数据重新写入到ByteBuf里呢。 这里涉及到writerIndex和readIndex, 上面的文章也提到很多简单来说你可能要重置一下然后再写入比如
msg.payload().resetReaderIndex();
msg.payload().resetWriterIndex();
msg.payload().writeBytes(bytes);但我这边碰到一个问题 就是我改写的数据比原来的数据长于是我就想对ByteBuf进行扩容。 而我查到的文章里都提到了ByteBuf是可以动态扩容
这里一个核心的代码就是 capacity和maxCapacity的问题 看了一遍源码没找到如何修改maxCapacity的地方。而判断语句里如果想扩容必须小于maxCapacity。 除非不checkBound但这个参数似乎不能轻易改变。
if (checkBounds (targetCapacity 0 || targetCapacity maxCapacity)) {ensureAccessible();throw new IndexOutOfBoundsException(String.format(writerIndex(%d) minWritableBytes(%d) exceeds maxCapacity(%d): %s,writerIndex, minWritableBytes, maxCapacity, this));
}3.解决方案
无法扩容只能重新赋值了这里msg用了replace的函数。
ByteBuf newBuffer ByteBufAllocator.DEFAULT.heapBuffer(newBytes.length);
newBuffer.writeBytes(newBytes);
msg msg.replace(newBuffer); 最后如果想彻底改变MqttPublishMessage的话还需赋值成final以解决lambda表达式报错问题
final MqttPublishMessage msgDecoded DecodeService.decode(msg);总结
maxCapacity无法改变只能重新赋值如有不对之处还请大侠指点。