启用EMQX ExHook时econnrefused错误的排查与解决方法
econnrefused 错误排查技巧 问题场景
使用EMQX 4.4.11,基于EMQX Java扩展SDK开发Hook插件,启动EMQX ExHook插件时出现连接拒绝错误,日志如下:
2022-12-15T09:14:32.374558+05:30 [error] [ExHook Svr] CALL emqx_exhook_v_1_hook_provider_client:on_provider_loaded(#{broker => #{datetime => "2022-12-15 09:14:32",sysdescr => "EMQ X Broker",uptime => "1 minutes, 1 seconds",version => "4.4.11"},meta => #{cluster_name => "emqxcl",node => <<"emqx@127.0.0.1">>,sysdescr => "EMQ X Broker",version => "4.4.11"}}, #{channel => "default",key_dispatch => <0.2007.0>,pool_size => 8,timeout => 5000}) error: econnrefused 2022-12-15T09:14:32.376430+05:30 [warning] Failed to reload exhook callback server "default", Reason: econnrefused
排查技巧
确认Java Hook服务状态
检查你的Java扩展服务是否成功启动,通过服务日志确认无启动异常。使用端口监听命令验证服务是否在指定端口监听:# Linux系统 netstat -tulpn | grep <你的Java服务端口> # 或 ss -tulpn | grep <你的Java服务端口>如果端口未被监听,说明Java服务未启动或启动失败,需排查服务启动失败原因(如依赖缺失、端口被占用)。
核对EMQX ExHook配置
打开EMQX的ExHook配置文件(etc/plugins/emqx_exhook.conf),检查exhook.default.url配置项,确保其地址、端口与Java Hook服务的监听地址完全一致。例如Java服务监听本地8081端口,配置应为http://127.0.0.1:8081,避免使用localhost可能带来的解析问题,优先使用明确IP。测试网络连通性
在EMQX所在机器上,直接测试与Java服务的网络连通性:# 测试端口是否可达 telnet <Java服务IP> <端口> # 或用curl测试服务接口(如果有健康检查接口) curl http://<Java服务IP>:<端口>/health若无法连通,需排查防火墙、安全组、iptables规则是否拦截了该端口,或两台机器(若跨部署)之间的网络是否正常。
检查Java服务监听范围
若EMQX与Java服务不在同一台机器,需确保Java服务的监听地址为0.0.0.0(允许所有IP访问)或对外可访问的IP,而非仅127.0.0.1(仅本地可访问)。查看Java服务详细日志
检查Java服务的运行日志,排查是否存在初始化失败、依赖加载错误、端口被占用等异常,这些问题可能导致服务无法正常监听端口。
内容的提问来源于stack exchange,提问作者Amalka Subasinghe

