`
m635674608
  • 浏览: 5054931 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ActiveMQ的断线重连机制

    博客分类:
  • MQ
 
阅读更多

断线重连机制是ActiveMQ的高可用性具体体现之一。

具体就是使用failover方式,使得连接断开之后,可以不断的重试连接到一个或多个brokerURL。

例如:failover:(tcp://127.0.0.1:61616) ,这里可以使用多个url。

默认情况下,如果client与broker直接的connection断开,则client会新起一个线程,

不断的从url参数中获取一个url来重试连接。

这个机制对于在容器中使用的connection木有问题。

activemq-core源码的test中也有多个client与broker之间断开重连10次的例子:

http://svn.apache.org/repos/asf/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/ReconnectTest.java

 

但是对于简单实现的一个独立运行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,都是可以自动重连的。

 

failover://(tcp://localhost:6168)?randomize=false&initialReconnectDelay=100&timeout=2000
failover:(tcp://localhost:6168?wireFormat.maxInactivityDuration=0)
&maxReconnectDelay=100&maxReconnectAttempts=1&timeout=2000
 
主要问题:
1、wireFormat.maxInactivityDuration=0,心跳参数,这样设置就是客户端永远不和服务器断。这就是为什么,没有连接上服务器,等重新连上之后,还能继续发送原来的消息。但是那个线程是一直等待的状态。
2、()内外的顺序,jms.prefetchPolicy.queuePrefetch=1,类似jms.*的参数必须在括号的外面。

 

http://blog.csdn.net/kimmking/article/details/8447517

http://jinguo.iteye.com/blog/243514

 

分享到:
评论

相关推荐

    JMS-ActiveMQ入门实例

    为了处理断线重连的情况,接收端可能使用了心跳机制和重试策略。心跳机制定时发送心跳消息以检测连接状态,如果连接中断,它会尝试重新建立连接。此外,可能会有一个重试逻辑,如果接收失败,它会等待一段时间后再...

    ActiveMq安卓端

    5. **错误处理和断线重连**:考虑到移动网络的不稳定,需要处理连接中断的情况,如实现重连机制,确保应用在网络恢复后能重新连接到ActiveMQ服务器。 6. **性能优化**:由于移动设备的资源限制,需要关注性能和电量...

    activeMQ 推送之mqtt客户端

    ActiveMQ 是一个开源的消息中间件,它遵循开放消息中间件协议(Open Message Broker Protocol),并且支持多种消息协议,包括 MQTT(Message Queuing Telemetry Transport)。MQTT 是一种轻量级的发布/订阅式消息...

    离线Stomp服务测试与WebSocket服务测试

    5. **断线重连**:当网络不稳定导致连接断开时,客户端应有机制自动尝试重新连接并恢复会话状态。 6. **错误处理**:处理连接失败、消息传递失败等异常情况。 在“WebSocket服务测试”中,我们通常会验证以下内容:...

    stomjs和sockjs

    3. **心跳和断线重连**:同样,SockJS也提供了心跳检测和断线后的自动重连功能。 4. **简单API**:SockJS的API设计简洁,与WebSocket API相似,便于开发人员上手。 在实际项目中,选择StomJS还是SockJS通常取决于...

    MyQQ代码

    这部分源码可能涉及心跳检测、断线重连机制,以及消息推送技术。 8. **安全性**:MyQQ会包含对用户隐私和数据安全的保护措施,如数据加密、防篡改机制,以及可能的反爬虫策略。 9. **性能优化**:为了提供流畅的...

    stomp实现多人聊天和单人聊天

    8. **错误处理和回退机制**:网络连接可能会断开,因此需要处理断线重连的情况。客户端应该有重试机制,并能识别服务器的错误消息。 9. **实时性与消息顺序**:为了保证聊天的实时性,通常需要尽快处理和发送消息。...

    多人在线聊天(Java版)

    此外,服务器还应处理断线重连、消息确认以及防止恶意攻击等安全问题。 在Java中,多线程技术是实现并发处理的关键,每个客户端连接都可以用一个单独的线程来处理,这样服务器就能同时处理多个客户端的请求。对于大...

    SMS短信平台代码

    4. **连接管理**:平台需要维护与短信网关的连接,包括建立连接、保持心跳、处理断线重连等。JAVA的`java.net.Socket`类可以用于TCP连接,`java.util.concurrent`包中的工具类可辅助管理连接池。 5. **消息队列**:...

    消息队列资料 系列课程资料

    4. 消费者心跳与重连:维护消费者状态,当消费者断线时,能够自动重新连接。 以上是对消息队列的基本介绍,本系列课程资料将通过更深入的讲解和实例分析,帮助你理解和掌握消息队列的使用,提升你在IT领域的专业...

    飞鸽源码(java版)

    飞鸽源码中可能包含TCP/IP协议栈的实现,如心跳机制、断线重连策略等,这些都是维持稳定通信的关键。 3. **并发处理** 由于即时通讯系统需要处理大量并发请求,线程池、并发容器(如ConcurrentHashMap)等并发工具...

Global site tag (gtag.js) - Google Analytics