ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - broker)之间的通信。
网络连接器(networkconnection)实现代理与代理之间的通信。(broker-to- broker);
一、TransportConnector支持的协议
ActiveMQ常用协议:
协议-描述-example
TCP-默认的协议性能相对来说还是可以的-tcp://host:port
NIO-基于TCP协议进行了扩展和优化,具有更好的扩展性-NIO://host:port
UDP-相比TCP性能更好,但是没有tcp可靠-udp://host:port
SSL-安全连接-ssl://host:port
Http(s)-基于http或https的链接-http://host:port
注意使用ssl时要证书Http(s)要导入httpclient相关jar包
具体demo见官网:http://activemq.apache.org/uri-protocols.html
这些传送协议都是在activemq.xml中配置的:
TCP: activemq.xml配置文件配置
<broker> ... <transportConnectors> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </<transportConnectors> ... </broker>
TCP:客户端代码:
connectionFactory = new ActiveMQConnectionFactory("admin", "admin","tcp://127.0.0.1:61616");
NIO:activemq.xml配置文件配置
<broker> ... <transportConnectors> <transportConnector name="nio" uri="nio://0.0.0.0:61616"/> </<transportConnectors> ... </broker>
NIO:客户端代码:
connectionFactory = new ActiveMQConnectionFactory("admin", "admin","nio://127.0.0.1:61616");
其他的也都一样!!!
二、newworkConnector(网络连接器)支持的协议
协议 描述 example
Static 静态协议 static://(tcp://ip:port)
Multicast 多点传送协议 uri="multicast://default"
这里先看两种协议,但支持的协议不只这两种。
1、静态网络连接器
静态网络连接器用于为一个网络中多个代理创建静态配置.这种配置协议使用了一种复合的URI--即包含其他URI的URI.
静态协议是broker to broker的连接。
静态网络连接器activemq.xml配置文件配置:可以和多个代理进行通信,进行数据的拉取。
<networkConnectors> <networkConnector name="local network" uri="static://(tcp://ip:61616,tcp://ip2:61616)"/> </networkConnectors>
实例:
代理A的配置
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerA" dataDirectory="${activemq.data}"> <transportConnectors> <transportConnector name="openwire" uri="tcp://127.0.0.1:61616" /> </transportConnectors> </broker>
代理B的配置
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerB" dataDirectory="${activemq.data}"> <transportConnectors> <transportConnector name="openwire" uri="tcp://127.0.0.1:61617" /> </transportConnectors> <networkConnectors> <networkConnector uri="static:(tcp://127.0.0.1:61616)" /> </networkConnectors> </broker>
代理B中配置了和代理A的网络连接,这样配置后就能实现数据从B代理到A代理的流动,即使客户端将消息发送到了B代理,但消息消费端访问A代理也能获取并消费发送到B代理的消息,这是因为他们之间配了网络连接即networkConnection,当消费端来消费消息的时候,A代理从B代理哪里吧消息读取过来在给访问A代理的消费者。
2、动态网络连接器
这种动态技术可以实现让客户端和代理之间,代理和代理之间实现动态识别,而不是配置静态的IP组。
多点传送协议,代理会广播自己的服务,也会定位其他代理。同理客户端可以通过多点协议来接收广播,识别出代理。
多址传送协议的URI语法如下:
multicast://ipadaddress:port?key=value
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.data}"> <networkConnectors> <networkConnector name="default-nc" uri="multicast://default"/> </networkConnectors> <transportConnectors> <transportConnector name="openwire" uri="tcp://127.0.0.1:61616" discoveryUri="multicast://default"/> </transportConnectors> </broker>
在上面的例子中,使用群组名称"default"来替代具体的IP地址.上面的配置代码片段中有两个地方比较重要.首先,transport connector的discoveryUri属性用于暴露这个传输连接器的URI到名称为default的群组中.所有的希望查找可用代理的客户端都可以使用这个代理。
network connector的uri属性用于查找可用的代理并与之建立代理网络.这样配置后,代理就像客户端一样,使用多点传送协议来查找其他代理。
移除discoveryUri属性,客户端就无法通过多点协议扫描到代理。
用多点传送协议的一个缺点是侦测是自动的.如果你不想把某个代理添加到群组中,你必须十分小心的设置。
客户端的自动侦测,通信语法是
discovery:(discoveryAgentURI)?key=value
如connectionFactory = new ActiveMQConnectionFactory("admin", "admin","discovery:(multicast://default)");
将会自动侦测组名为default的代理。
上面的配置 <transportConnectorname="openwire" uri="tcp://localhost:61616"discoveryUri="multicast://default"/>代理将会被侦测到。
三、Failover(失效重连协议)
failover:(uri1,...,uriN)?key=value
或者failover:uri1,...,uriN,如
failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false
详细查看http://activemq.apache.org/failover-transport-reference.html
默认情况是先随机选择一个连接器,如果该连接器无效,那么会选择下一个。
失效转移连接器URI:是在客户端方面的协议,客户端在链接代理时需要保证链接的可用和可靠。实际上就算客户端只会连接一个代理,也应该使用failover配置通信协议,保证网络中断等问题时会自动重连。
失效重连协议是客户端方面的额协议,所以activemq.xml配置文件中就不用配置什么了……
实例:
connectionFactory = new ActiveMQConnectionFactory("admin", "admin","failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false&priorityBackup=true");
首先连接61616 如果连接失败则连接61617
设置连接优先级:
failover:(tcp://local1:61616,tcp://local2:61616,tcp://remote:61616)?randomize=false&priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616
其他配置见管网.
总结:
1、传输连接器:主要是用户客户端到消息服务端的连接,在activemq的传输连接器<TransportConnector> 中配置,同时客户端ConnectionFactory中也配置同样的协议!
2、网络连接器:主要是代理和代理之间通信的,通信的目的就是数据的拉取!
3、失效重连协议:这个协议是客户端的协议,在创建ConnectionFactory 对象的时候可以指定多个JMS服务,并且可以指定优先级,这样就会按照优先级进行连接,如果优先级最高的能连上则连接他如果优先级最高的机器连接不上则连接连接优先级次高的以此类推。
参考文章:http://blog.csdn.net/vtopqx/article/details/51787717