干货案例:坑爹cmd 执行jar不打印日志,服务端hang(卡住)问题

干货案例:坑爹cmd 执行jar不打印日志,服务端hang(卡住)问题

1321发表于2019-04-13

最近解决了一个坑爹cmd 执行jar不打印日志,服务端假死hang住问题。

使用技术:java Main控制台+Netty服务端+c#客户端(socket)+长链接(心跳保活)+logback记录日志(文件+控制台)

java服务端采用,logger.debug写日志

问题描述:

cmd运行java jar包 运行一段时间后 服务会卡住(就像假死一样) 按一下回车或者在控制台内部鼠标右键又可以继续执行,而且后跳出一段之前收到的信息,这时客户端才会收到响应内容。

这个问题就是像是假死一样,也不报错,客户端能正常发送信息说明socket通道是通的。

在服务端卡住的时候,客户端能正常发送心跳包,但是无返回。


按一下回车或者在控制台内部鼠标右键,恢复正常:

客户端:


服务端:


解决方案:

当初怀疑是服务端hang住了,是不是死锁,是不是logback或netty框架配置问题,或许是不是服务端代码的问题?

于是通过jps,jstack导出线程堆栈。也没有发现死锁和其它问题。

后来一个同学的贴子让我醍醐灌顶。感谢一下:https://blog.csdn.net/yiyanbuhe/article/details/78927453

重点来了。!!!!!!!!!!!!!!!!!!!

cmd默认开启了“快速编辑模式”,只要当鼠标点击cmd任何区域时,就自动进入了编辑模式,之后的程序向控制台输入内容甚至后台的程序都会被阻塞。

我们在控制台里面回车或者右键鼠标后,自动退出了编辑模式。因此,控制又恢复输出内容,服务端又正常了。

通过上面的分析你应该知道,为什么会出现本文开头描述的问题了,聪明的你应该知道怎么处理了吧?

关闭这个快速编辑模式就ok了。

在cmd窗口的标题上鼠标右键,调出属性和默认属性把这个关掉就行了。

真是坑爹啊!



小编蓝狐