第八章起是 MINA 的核心部分。一直到第十二章,将对 IoBuffer,以及几个过滤器,编解码器、执行者、SSL、日志等过滤器进行详细讨论。
IoBuffer
MINA 应用所用的一个字节缓存。
它是 java.nio.ByteBuffer 的替代。MINA 不直接使用 NIO 的 ByteBuffer 有两个原因:
IoBuffer 操作
分配一个新缓存
IoBuffer 是个抽象类,因此不能够直接被实例化。要分配 IoBuffer,我们需要使用两个 allocate() 方法中的其中一个。
// Allocates a new buffer with a specific size, defining its type (direct or heap)
public static IoBuffer allocate(int capacity, boolean direct)
// Allocates a new buffer with a specific size
public static IoBuffer allocate(int capacity)
allocate() 方法具有一个或两个参数。第一种方式具有两个参数:
// Allocates heap buffer by default.
IoBuffer.setUseDirectBuffer(false);
// A new heap buffer is returned.
IoBuffer buf = IoBuffer.allocate(1024);
当使用第二种形式的时候,别忘了先设置以下默认的缓存类型,否则你将被默认获得堆缓存。
创建自动扩展缓存
使用 Java NIO API 创建自动扩展缓存不是一件容易的事情,因为其缓存大小是固定的。有一个缓冲区,可以根据需要自动扩展是网络应用程序的一大亮点。为解决这个,IoBuffer 引入了 autoExpand 属性。它可以自动扩大容量和限值。
我们看一下如何创建一个自动扩展的缓存:
IoBuffer buffer = IoBuffer.allocate(8);
buffer.setAutoExpand(true);
buffer.putString("12345678", encoder);
// Add more to this buffer
buffer.put((byte)10);
潜在的 ByteBuffer 会被 IoBuffer 在幕后进行分配,如果上面例子中的编码信息大于 8 个字节的话。其容量将会加倍,而且其上限将会增加到字符串最后写入的位置。这行为很像 StringBuffer 类的工作方式。
这种机制很可能要在 MINA 3.0 中被移除,因为它其实并非最好的处理增加缓存大小的方法。它可能会被其它方案代替,像隐藏了一个列表的 InputStream,或者一个装有一系列固定容量的 ByteBuffer 的数组。
创建自动收缩的缓存
还有一些机制释放缓存中多余分配的字节,以保护内存。IoBuffer 提供了 autoShrink 属性以满足这一需要。如果打开 autoShrink,当 compact() 被调用时 IoBuffer 将缓存分为两半,只有 1/4 或更少的当前容量正在被使用。要手工减少缓存的话使用 shrink() 方法。
可以用例子对此进行验证:
IoBuffer buffer = IoBuffer.allocate(16);
buffer.setAutoShrink(true);
buffer.put((byte)1);
System.out.println("Initial Buffer capacity = "+buffer.capacity());
buffer.shrink();
System.out.println("Initial Buffer capacity after shrink = "+buffer.capacity());
buffer.capacity(32);
System.out.println("Buffer capacity after incrementing capacity to 32 = "+buffer.capacity());
buffer.shrink();
System.out.println("Buffer capacity after shrink= "+buffer.capacity());
我们初始化分配的容量是为 16,并且将 autoShrink 属性设为 true。
我们看一下它的输出:
Initial Buffer capacity = 16
Initial Buffer capacity after shrink = 16
Buffer capacity after incrementing capacity to 32 = 32
Buffer capacity after shrink= 16
现在停下来分析输出:
缓存分配
IoBufferAllocater 负责分配并管理缓存。要获取堆缓存分配的精确控制,你需要实现 IoBufferAllocater 接口。
MINA 具有以下 IoBufferAllocater 实现:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://defonds.blog.csdn.net/article/details/18083377
内容来源于网络,如有侵权,请联系作者删除!