ActiveMQ的断线重连机制

断线重连机制是ActiveMQ的高可用性具体体现之一。ActiveMQ提供failover机制去实现断线重连的高可用性,可以使得连接断开之后,不断的重试连接到一个或多个brokerURL。

默认情况下,如果client与broker直接的connection断开,则client会新起一个线程,不断的从url参数中获取一个url来重试连接。

配置语法

failover:(uri1,...,uriN)?transportOptions&nestedURIOptions
or
failover:uri1,...,uriN

例如:

failover:(tcp://localhost:61616,tcp://remotehost:61616)?initialReconnectDelay=100

具体配置参数参考:http://activemq.apache.org/failover-transport-reference.html

使用randomize

默认情况下,failover机制从URI列表中随机选择出一个URI进行连接,这可以有效地控制客户端在多个broker上的负载均衡,但是,要使客户端首先连接到主节点,并在主节点不可用时只连接到辅助备份代理,需要设置randomize = false。

failover:(tcp://master:61616,tcp://slave:61616)?randomize=false

在failover机制下传输,发送操作将默认在broker变得不可用时无限期阻塞。 有两个选项可用于处理此方案。 首先,直接在ActiveMQConnectionFactory上设置一个TransportListener,以便在任何可能需要网络跳跃的请求之前就位,或者设置超时选项。 超时选项会导致当前发送操作在指定的超时后失败。

failover:(tcp://primary:61616)?timeout=3000

在此示例中,如果连接未建立,发送操作将在3秒后超时。 需要注意的是,当超时发生时连接不会被终止。 因此,一旦broker可用,以后可能使用相同的连接重新发送受影响的消息。

broker端的配置参数
这里写图片描述
例子:

<broker>
    ...
    <transportConnectors>
        <transportConnector name="openwire"
        uri="tcp://0.0.0.0:61616"
        updateClusterClients="true"
        updateClusterFilter=".*A.*,.*B.*"/>
    </<transportConnectors>
    ...
</broker>

当updateClusterClients=”true”时,client端的failover配置只需要写成:

failover:(tcp://primary:61616)

当新的broker加入集群时,客户端被自动通知新的broker的URI。 当其他已知broker之一不可用时,新的URI可用于故障转移。

Priority Backup

ActiveMQ 5.6+开始,如果broker在本地和远程网络中都可用,则可以使用priorityBackup和priorityURIs选项为远程broker指定本地broker的首选项。

failover:(tcp://local:61616,tcp://remote:61616)randomize=false&priorityBackup=true

以上配置例子,客户端将尝试连接并保持连接到本地broker。 如果本地broker失败,它当然会故障转移到远程。 但是,由于使用priorityBackup参数,客户端将不断尝试重新连接到本地。 一旦客户端可以这样做,客户端将重新连接到它,而不需要任何手动干预。

默认情况下,只有列表中的第一个URI被视为优先级(本地)。 在大多数情况下,这就足够了。 然而,在一些情况下,可能需要具有多个“本地”URI。 priorityURIs选项可用于指定哪些URI被视为优先级。

failover:(tcp://local1:61616,tcp://local2:61616,tcp://remote:61616)?randomize=false&priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616
在使用 ActiveMQ 进行消息传递时,可能会遇到连接断开的情况,此时可以采用自动重连机制来保证消息传输的可靠性。在 ActiveMQ 中,可以通过配置 ConnectionFactory 对象来实现自动重连。 具体操作步骤如下: 1. 创建 ConnectionFactory 对象时,设置其属性,例如: ``` ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); connectionFactory.setUserName(username); connectionFactory.setPassword(password); connectionFactory.setRedeliveryPolicy(redeliveryPolicy); ``` 其中,`url` 是连接 ActiveMQ 的 URL,`username` 和 `password` 是登录 ActiveMQ 的用户名和密码,`redeliveryPolicy` 是重发策略对象。 2. 设置重连策略,例如: ``` RedeliveryPolicy redeliveryPolicy = connectionFactory.getRedeliveryPolicy(); redeliveryPolicy.setInitialRedeliveryDelay(1000); redeliveryPolicy.setBackOffMultiplier(2); redeliveryPolicy.setMaximumRedeliveryDelay(30000); redeliveryPolicy.setUseExponentialBackOff(true); connectionFactory.setRedeliveryPolicy(redeliveryPolicy); ``` 其中,`InitialRedeliveryDelay` 是初始重发延迟时间,`BackOffMultiplier` 是指数退避系数,`MaximumRedeliveryDelay` 是最大重发延迟时间,`UseExponentialBackOff` 表示是否使用指数退避算法。 3. 创建 Connection 对象时,设置其异常监听器,例如: ``` connection.setExceptionListener(new ExceptionListener() { @Override public void onException(JMSException exception) { // 处理连接异常,例如重新连接 } }); ``` 其中,`onException()` 方法会在连接异常时被调用,可以在该方法中处理连接异常,例如重新连接。 通过以上步骤,即可实现 ActiveMQ 的自动重连功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值