断线重连机制是ActiveMQ的高可用性具体体现之一。
具体就是使用failover方式,使得连接断开之后,可以不断的重试连接到一个或多个brokerURL。
例如:failover:(tcp://127.0.0.1:61616) ,这里可以使用多个url。
默认情况下,如果client与broker直接的connection断开,则client会新起一个线程,
不断的从url参数中获取一个url来重试连接。
这个机制对于在容器中使用的connection木有问题。
activemq-core源码的test中也有多个client与broker之间断开重连10次的例子:
但是对于简单实现的一个独立运行client,一般重连一次就会出现进程退出的bug:https://issues.apache.org/jira/browse/AMQ-796
可以测试如下:
1、通过命令行启动一个broker
2、在java中创建一个connection,添加一个TransportListener,使用如下代码来根据连接断开与重连。
@Override
public void transportInterupted() {
System.out.println("===>> 断开");
}
@Override
public void transportResumed() {
System.out.println("===>> 重连");
}
3、运行程序
4、停止broker,再启动broker
5、观察到断开与重连
6、再停止broker,发现程序自动退出。
程序退出不再重连的原因在于重连的线程是daemon的,连接出错以后,其他线程都退出了,这个线程也随即被销毁掉了。
官方修复过一次,在ActiveMQ Connection Executor上设置了daemon=false,但是这个线程不一定被创建出来。所以bug依然在。
修复的方法很简单:
FailoverTransport.java 的132 行
reconnectTaskFactory = new TaskRunnerFactory();
reconnectTaskFactory.setDaemon(false); // to set daemon=false by kimmking
reconnectTaskFactory.init();
把重连的线程设置成daemon=false就成。
然后再按照上面的步骤来执行,发现多次重启broker,都是可以自动重连的。
http://blog.csdn.net/kimmking/article/details/8447517
http://jinguo.iteye.com/blog/243514
相关推荐
为了处理断线重连的情况,接收端可能使用了心跳机制和重试策略。心跳机制定时发送心跳消息以检测连接状态,如果连接中断,它会尝试重新建立连接。此外,可能会有一个重试逻辑,如果接收失败,它会等待一段时间后再...
5. **错误处理和断线重连**:考虑到移动网络的不稳定,需要处理连接中断的情况,如实现重连机制,确保应用在网络恢复后能重新连接到ActiveMQ服务器。 6. **性能优化**:由于移动设备的资源限制,需要关注性能和电量...
ActiveMQ 是一个开源的消息中间件,它遵循开放消息中间件协议(Open Message Broker Protocol),并且支持多种消息协议,包括 MQTT(Message Queuing Telemetry Transport)。MQTT 是一种轻量级的发布/订阅式消息...
5. **断线重连**:当网络不稳定导致连接断开时,客户端应有机制自动尝试重新连接并恢复会话状态。 6. **错误处理**:处理连接失败、消息传递失败等异常情况。 在“WebSocket服务测试”中,我们通常会验证以下内容:...
3. **心跳和断线重连**:同样,SockJS也提供了心跳检测和断线后的自动重连功能。 4. **简单API**:SockJS的API设计简洁,与WebSocket API相似,便于开发人员上手。 在实际项目中,选择StomJS还是SockJS通常取决于...
这部分源码可能涉及心跳检测、断线重连机制,以及消息推送技术。 8. **安全性**:MyQQ会包含对用户隐私和数据安全的保护措施,如数据加密、防篡改机制,以及可能的反爬虫策略。 9. **性能优化**:为了提供流畅的...
8. **错误处理和回退机制**:网络连接可能会断开,因此需要处理断线重连的情况。客户端应该有重试机制,并能识别服务器的错误消息。 9. **实时性与消息顺序**:为了保证聊天的实时性,通常需要尽快处理和发送消息。...
此外,服务器还应处理断线重连、消息确认以及防止恶意攻击等安全问题。 在Java中,多线程技术是实现并发处理的关键,每个客户端连接都可以用一个单独的线程来处理,这样服务器就能同时处理多个客户端的请求。对于大...
4. **连接管理**:平台需要维护与短信网关的连接,包括建立连接、保持心跳、处理断线重连等。JAVA的`java.net.Socket`类可以用于TCP连接,`java.util.concurrent`包中的工具类可辅助管理连接池。 5. **消息队列**:...
4. 消费者心跳与重连:维护消费者状态,当消费者断线时,能够自动重新连接。 以上是对消息队列的基本介绍,本系列课程资料将通过更深入的讲解和实例分析,帮助你理解和掌握消息队列的使用,提升你在IT领域的专业...
飞鸽源码中可能包含TCP/IP协议栈的实现,如心跳机制、断线重连策略等,这些都是维持稳定通信的关键。 3. **并发处理** 由于即时通讯系统需要处理大量并发请求,线程池、并发容器(如ConcurrentHashMap)等并发工具...