最近解决了一个坑爹cmd 执行jar不打印日志,服务端假死hang住问题。
使用技术:java Main控制台+Netty服务端+c#客户端(socket)+长链接(心跳保活)+logback记录日志(文件+控制台)
java服务端采用,logger.debug写日志
问题描述:
cmd运行java jar包 运行一段时间后 服务会卡住(就像假死一样) 按一下回车或者在控制台内部鼠标右键又可以继续执行,而且后跳出一段之前收到的信息,这时客户端才会收到响应内容。
这个问题就是像是假死一样,也不报错,客户端能正常发送信息说明socket通道是通的。
在服务端卡住的时候,客户端能正常发送心跳包,但是无返回。
按一下回车或者在控制台内部鼠标右键,恢复正常:
客户端:
服务端:
解决方案:
当初怀疑是服务端hang住了,是不是死锁,是不是logback或netty框架配置问题,或许是不是服务端代码的问题?
于是通过jps,jstack导出线程堆栈。也没有发现死锁和其它问题。
重点来了。!!!!!!!!!!!!!!!!!!!
cmd默认开启了“快速编辑模式”,只要当鼠标点击cmd任何区域时,就自动进入了编辑模式,之后的程序向控制台输入内容甚至后台的程序都会被阻塞。
我们在控制台里面回车或者右键鼠标后,自动退出了编辑模式。因此,控制又恢复输出内容,服务端又正常了。
通过上面的分析你应该知道,为什么会出现本文开头描述的问题了,聪明的你应该知道怎么处理了吧?
关闭这个快速编辑模式就ok了。
在cmd窗口的标题上鼠标右键,调出属性和默认属性把这个关掉就行了。
真是坑爹啊!