ActiveMQ 动态网络连接

静态网络连接是通过显示的定义网络地址,这无疑给我们的工作量带来了一定的麻烦,现在看看动态的网络连接。
多播的默认格式如下:

1
multicast://ipaddress:port?key=value

例子

broker和broker用的是多播协议:通过IP进行一对多通信网络,生产者使用这个地址作为数据的目的地,而消费者使用它来表达他们对数据关注的来源。
client和broker用的是Discovery协议,它将使用多播来发现可用的broker然后随机选择一个连接到broker。
61616的activemq.xml配置

1
2
3
4
5
6
7
8
9
<transportConnectors>    
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"
discoveryUri="multicast://default"/>
</transportConnectors>


<networkConnectors>
<networkConnector name="default-nc" uri="multicast://default"/>
</networkConnectors>

61618的activemq.xml配置

1
2
3
4
5
6
7
8
9
<transportConnectors>    
<transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"
discoveryUri="multicast://default"/>
</transportConnectors>


<networkConnectors>
<networkConnector name="default-nc" uri="multicast://default"/>
</networkConnectors>

java代码中:
Consumer61616连接61616,Consumer61618连接61618。
Producer61616连接61616,Producer61618连接61618。
Producer61618发送6条消息,Consumer61616和Consumer61618各消费3条。
在这个例子中,我们没有指定两个broker互相通信的ip,但是也有以下的问题:

  1. 多播是自动的,有些broker即时我们不想加入到这个组中,还是会被动的加进去。当然可以通过移除discoveryUri或者networkConnectors来实现不加入组的目的。
  2. 多播的网络通信比较频繁,消耗性能。

配置

multicast

属性 默认值 描述
group default 表示唯一的组名称
minmumWireFormatVersion 0 被允许的最小的wireformat版本
trace false 否追踪记录日志
useLocalHost true 表示本地机器的名称是否为localhost
datagramSize 4 * 1024 指定的数据大小
timeToLive -1 消息的生命周期
loopBackMode false 是否启用loopback模式
wireFormat 默认用wireFormat命名
wireFormat.* 前缀是wireFormat

discovery

属性 默认值 描述
reconnectDelay 0 再次寻址等待时间
initialReconnectDelay 10 初始化设定再次寻址等待时间
maxReconnectDelay 30000 最大寻址等待时间
useExponentialBackOff true 是否尝试BackOff重链接
backOffMultiplier 2 尝试Backoff的次数
maxReconnectAttempts 0 如果异常,最大的重新链接个数
group default 组唯一的地址