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” 博客,谢绝转载!
目前使用中,发生的一些问题主要集中在线程的注销上,发现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” 博客,谢绝转载!
相关文章推荐
- 使用UDP协议发送和接收数据
- 使用UDP协议编写一个网络程序
- Linux Socket网络编程 分别使用TCP协议 和 UDP协议
- (转)DNS使用的是TCP协议还是UDP协议
- 基于UDP协议的网络编程(使用DatagramSocket发送接收数据)
- UDP协议的简单使用
- Samba 服务使用的端口和协议(是一组TCP UDP协议的组合,主要使用CIFS协议,有一个Java例子)
- 使用Java控制UDP协议
- 在.net中使用Udp协议创建简单的聊天程序
- VB中Winsock控制的UDP协议的使用
- DNS使用的是TCP协议还是UDP协议
- DNS使用的是TCP协议还是UDP协议简析
- UDP协议发包的使用(DatagramSocket、DatagramPacket)
- 使用python编写udp协议的ping程序
- 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)
- 使用python编写udp协议的ping程序方法
- Linux网络编程5——使用UDP协议实现群聊
- DNS使用的是TCP协议还是UDP协议?
- java使用UDP协议传输数据
- 使用wireshark分析TCP及UDP协议