静态网络连接是通过显示的定义网络地址,这无疑给我们的工作量带来了一定的麻烦,现在看看动态的网络连接。
多播的默认格式如下:
multicast://ipaddress:port?key=value
例子
broker和broker用的是多播协议:通过IP进行一对多通信网络,生产者使用这个地址作为数据的目的地,而消费者使用它来表达他们对数据关注的来源。
client和broker用的是Discovery协议,它将使用多播来发现可用的broker然后随机选择一个连接到broker。
61616的activemq.xml配置
<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配置
<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。
具体代码参考点对点模式,端口对应好。
Producer61616发送6条消息,Consumer61616和Consumer61618各消费3条。
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 | 组唯一的地址 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。