前言
这两天学习Moquette,对ByteBuf做了点研究,对于maxCapacity有了进一步了解。
一、ByteBuf是什么?
最早是在netty中有接触,这算是是核心了,有很多文章进行介绍:
二、如何改变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无法改变,只能重新赋值,如有不对之处,还请大侠指点。