canal从mysql读binlog事件时,建的连接设置了读超时时间: channel.socket().setSoTimeout(this.soTimeout); ,soTimeout用了30s。
读binlog事件时,用了SocketChannel.read(buffer)方法,soTimeout对这个SocketChannel的read方法无效,永远不会超时,参考http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4614802。
如果mysql有一段时间没数据(比如一个小时),这个连接失效了(可能因为防火墙问题,参考http://www.tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html的2.4. 虽然设置了channel.socket().setKeepAlive(true),但是linux系统默认的keepalive配置时间太长、不起作用。),但canal还在永远阻塞read。
所以是不是用sock.socket().getInputStream()这个来read比较好,如果在soTimeout内没读到数据,就超时了,强制重新建立连接。
原提问者GitHub用户chelubaiq
目前设计时依赖于MySQL数据库的空闲链接超时机制,默认是8小时会断开链接,你的链接失效是指半开链接么?这个客户端能获取到EOFException
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。