您的位置:首页 > 其它

mina使用UDP协议的小结

2008-07-30 13:44 253 查看
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;
}});

一般应用是可以不管这些东西的.
本文出自 “xiaofenguser” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: