静态网络连接是通过显示的定义网络地址,这无疑给我们的工作量带来了一定的麻烦,现在看看动态的网络连接。
多播的默认格式如下:
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&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&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,但是也有以下的问题:
- 多播是自动的,有些broker即时我们不想加入到这个组中,还是会被动的加进去。当然可以通过移除discoveryUri或者networkConnectors来实现不加入组的目的。
- 多播的网络通信比较频繁,消耗性能。
配置
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 |
组唯一的地址 |