Apache Camel AHC-WS Websocket服务端意外断连后自动重连失败问题
问题根因
你配置的deadLetterChannel属于路由消息处理级别的错误处理器,仅对消息进入路由后,后续Filter、Process等节点抛出的异常生效。而Websocket连接意外断开属于AHC-WS消费者生命周期层面的连接异常,并不在普通错误处理器的管控范围内,因此你配置的10次重发规则不会作用于连接重建场景。
你看到的单次异常触发,只是连接断开时的事件通知,底层WSS连接已经被销毁,没有配套的重连逻辑自然无法恢复。
修复方案
直接在AHC-WSS消费者的URI参数中添加官方自带的自动重连配置即可,不需要额外自定义重连逻辑:
- 新增
autoReconnect=true开启连接断开自动重连能力 - 新增
maxReconnectAttempts=10配置最大重连次数 - 新增
reconnectDelay=1000配置首次重连等待时长(单位毫秒) - 新增
reconnectBackOffMultiplier=2配置指数退避倍数,和你原有错误处理器的退避策略对齐
修改后的示例代码
errorHandler(deadLetterChannel("seda:dead") .maximumRedeliveries(10).useExponentialBackOff() .log("Route exception")); // 新增自动重连相关参数 fromF("ahc-wss://some-url?bridgeErrorHandler=true&sendMessageOnError=true&autoReconnect=true&maxReconnectAttempts=10&reconnectDelay=1000&reconnectBackOffMultiplier=2") .filter(exchange -> exchange.getIn().getBody() != null) .process(exchange -> { String msg = (String) exchange.getIn().getBody(); log.info("Message size: " + msg.length()); }) .log("test done");
版本兼容说明
如果你使用的Camel版本低于2.21,AHC-WS组件未内置自动重连参数,可以通过自定义路由监听器实现重连:捕获到连接断开的IOException后,调用Camel上下文的RouteController重启对应路由即可达到相同效果。
内容的提问来源于stack exchange,提问作者user5425928
相关产品推荐
相关产品推荐

