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;
   }});
 
一般应用是可以不管这些东西的.