锁定老帖子 主题:求探讨:mina2服务器读写阻塞
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2013-02-18
最后修改:2013-02-18
服务器端用mina2.0.4作为通讯框架, 封装了自己的消息格式,采用byte流的方式进行交互, 在测试过程中,并发量50以下正常运行, 在超过100时,服务器无法正常发送消息,问题描述如下: 以调试模式启动服务器, 此时停止所有客户端, 1,重新连接一个新的客户端,服务端能在sessionOpen中捕获并处理客户连接; 2,服务器只有第一条消息被发出, 跟踪filter,编码解码都正常, ExecutorFilter的messageReceived成功将解码消息压入tasksQueue, 此时客户端收到第一条消息; 3,当客户端下一个消息到达时, ExecutorFilter的messageReceived成功将解码消息压入tasksQueue, 但是IoHandler没有触发messageReceived, 在对应的SessionTasksQueue中,可以看到第一条已发送的消息并没有被删除(仍然存在此queue中!), 此后所有此客户端的收发消息都没有正常处理,而线程池并没有run out,也没有检测到线程被挂起, 我使用的是OrderedThreadPoolExecutor, // 编码解码 chain.addLast("codec", new ProtocolCodecFilter(new FireProtocolCodecFactory())); // 业务线程 executor = new OrderedThreadPoolExecutor(100, 1000, 5, TimeUnit.SECONDS, Executors.defaultThreadFactory(), null); chain.addLast("threadPool", new ExecutorFilter(executor)); 4,打开mina debug,关键log如下: 正常: 2013-02-18 15:11:53,282 - Adding event SESSION_OPENED to session 2 Queue : [SESSION_OPENED, ] 2013-02-18 15:11:53,316 - Adding event MESSAGE_SENT to session Queue : [MESSAGE_SENT, ] 2013-02-18 15:11:53,318 - Adding event MESSAGE_SENT to session 2 Queue : [MESSAGE_SENT, , MESSAGE_SENT, ] 2013-02-18 15:12:03,361 - Adding event MESSAGE_RECEIVED to session 2 Queue : [MESSAGE_RECEIVED, ] 异常: 2013-02-18 15:09:03,055 - Adding event SESSION_OPENED to session 114 Queue : [SESSION_OPENED, ] 2013-02-18 15:09:03,056 - Adding event MESSAGE_SENT to session 114 Queue : [MESSAGE_SENT, ] 2013-02-18 15:09:03,056 - Adding event MESSAGE_SENT to session 114 Queue : [MESSAGE_SENT, , MESSAGE_SENT, ] 2013-02-18 15:09:13,113 - Adding event MESSAGE_RECEIVED to session 114 Queue : [MESSAGE_SENT, , MESSAGE_SENT, , MESSAGE_RECEIVED, ] 求指教和探讨,问题如有描述不清晰请指明,谢谢 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-02-18
没有人遇到类似问题么?
还是问题表述不够详细? 我的疑问在于为什么在异常情况下, 消息已经成功发出,但是却没有从SessionTasksQueue中删除, 纠结,这里有其他设置可以影响到么?难道非得改源码! 以下是session config, acceptor.setReuseAddress(true); acceptor.setBacklog(3000); acceptor.getSessionConfig().setReuseAddress(true);//SO_REUSEADDR acceptor.getSessionConfig().setReceiveBufferSize(512); acceptor.getSessionConfig().setSendBufferSize(4096); acceptor.getSessionConfig().setTcpNoDelay(true);//TCP_NODELAY acceptor.getSessionConfig().setKeepAlive(false);//SO_KEEPALIVE acceptor.getSessionConfig().setSoLinger(0);//SO_LINGER acceptor.getSessionConfig().setReaderIdleTime(300); acceptor.getSessionConfig().setWriterIdleTime(300); acceptor.getSessionConfig().setBothIdleTime(300); acceptor.getSessionConfig().setWriteTimeout(10);//SO_TIMEOUT acceptor.getSessionConfig().setThroughputCalculationInterval(2); acceptor.getSessionConfig().setReadBufferSize(256);//SO_RCVBUF acceptor.getSessionConfig().setMaxReadBufferSize(2048); acceptor.getSessionConfig().setOobInline(false);//SO_OOBINLINE acceptor.getSessionConfig().setUseReadOperation(false); |
|
返回顶楼 | |
发表时间:2013-02-18
可以先试试普通的cachedExecutor
|
|
返回顶楼 | |
发表时间:2013-02-18
你的编码和解码是咋写的?
|
|
返回顶楼 | |
发表时间:2013-02-18
换个ThreadPoolExecutor试试
|
|
返回顶楼 | |
发表时间:2013-02-19
谢谢,换过thread pool,现象一样,
//编码解码 chain.addLast("codec", new ProtocolCodecFilter(new FireProtocolCodecFactory())); //业务线程 executor = Executors.newCachedThreadPool(); 回2楼兄弟, 编码解码没有问题, 调试模式在filter链中可以看到消息被正常解码, 3,当客户端下一个消息到达时, ExecutorFilter的messageReceived成功将解码消息压入tasksQueue, 但是IoHandler没有触发messageReceived, 头疼,在看源码了,希望有类似经验的可以再提示提示,先谢过 |
|
返回顶楼 | |
发表时间:2013-02-19
flash+java实时应用,其实不需要自己用mina写server端
推荐用red5 |
|
返回顶楼 | |
发表时间:2013-02-19
red5,
好,谢谢, 有时间我看看, 不过现在通讯,逻辑,业务都是一起开发的, 这个项目至少暂时没有换的想法 |
|
返回顶楼 | |
发表时间:2013-02-19
服务器配置咋样啊!
|
|
返回顶楼 | |
发表时间:2013-02-19
最后修改:2013-02-19
多贴点代码吧,把相关代码都贴一下,应该是使用上的问题。看代码的话可以参考http://scriptguy.iteye.com/blog/1774032
|
|
返回顶楼 | |