mina是一个优秀的网络应用框架,优点当然是多多的,
目前使用中,发生的一些问题主要集中在线程的注销上,发现mina自身线程的注销方面做得不是太好.这里总结下UDP协议上的一些线程注销上需要注意的东西.
DatagramConnectorConfig对象:
config.setSessionRecycler(IoSessionRecycler.NOOP);
这里面实际上已经有一个超时重发的线程被mina丢掉了,但是它还在运行.
改进方法:
((ExpiringSessionRecycler)config.getSessionRecycler()).stopExpiring(); config.setSessionRecycler(IoSessionRecycler.NOOP);
先禁掉系统默认的超时重发线程.
config的ThreadModel里的Executor也不能自己注销的,注销时,需要这样:
((ThreadPoolExecutor)((ExecutorThreadModel)config.getThreadModel()).getExecutor()).shutdown();
DatagramConnector对象:
connector = new DatagramConnector();
这里面也有一个NewThreadExecutor线程处理对象在运行,也是关不掉的.
改进方法:
ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(5,
new TaskThreadFactory("protocol-pool-"),
new ThreadPoolExecutor.DiscardOldestPolicy());
connector = new DatagramConnector(threadPoolExecutor);
自己定义连接使用的线程池,自己可以控制注销线程池.
ByteBuffer对象:
这个对象里有这么一个东西
private static ByteBufferAllocator allocator = new PooledByteBufferAllocator();
这个东西里面有一个糟糕的东西
PooledByteBufferAllocator里有一个Expirer对象,它也是一个死线程,mina没有直接的方法可以停掉它,在注销时,可以用下面这种笨办法让mina处理掉自己
ByteBuffer.setAllocator(new ByteBufferAllocator(){
public ByteBuffer allocate(int capacity, boolean direct) {
return null;
}
public void dispose() {
}
public ByteBuffer wrap(java.nio.ByteBuffer nioBuffer) {
return null;
}});
一般应用是可以不管这些东西的.