传输协议
ActiveMQ默认传输协议为TCP,即我们示例中使用的tcp://192.168.1.3:61616,可以在ActiveMQ安装目录conf/activemq.xml找到其配置文件
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
从配置文件可以看出有多种协议,每种协议有着不同的使用场景,另外协议后面还以跟参数&key=value,具体可以参考官方文档 http://activemq.apache.org/configuring-transports.html 配置传输。为什么tcp的name=openwire?在tcp传输数据前,必需要序列化数据,消息是通过一个叫wire protocol来序列化成字节流。所以activemq的默认协议取名叫openwire
使用nio提高传输性能
官方使用的这些传输协议使用的是bio,关于bio、nio这里不做介绍。如果要使用nio,需要追加配置。
<transportConnectors>
<transportConnector name="nio" uri="nio://0.0.0.0:61618"/> <!-- tcp的nio -->
<transportConnector name="mqtt+nio" uri="mqtt+nio://0.0.0.0:61618"/> <!-- 其他协议的nio使用 -->
</transportConnectors>
//替换为nio
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("nio://192.168.1.3:61618");
自动适配协议
从5.13.0版开始,ActiveMQ支持wire format protocol(这个东东不知道怎么理解官方原话)检测。可以自动检测OpenWire,STOMP,AMQP和MQTT。这样就可以为所有4种类型的客户端共享一种传输方式。怎么理解?就好比一个盒子上集成了多种协议:usb、hdmi、type-c等等;但是盒子本身只有一个端口,当接上盒子后,盒子会自动检查你使用的什么协议传输。官方文档http://activemq.apache.org/auto
<transportConnector name="auto" uri="auto://0.0.0.0:5671"/> <!-- 自动检测协议 -->
<transportConnector name="auto+ssl" uri="auto+ssl://0.0.0.0:5671"/> <!-- auto+ssl -->
<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:5671"/> <!-- auto+nio -->
<transportConnector name="auto+nio+ssl" uri="auto+nio+ssl://0.0.0.0:5671"/> <!-- auto+nio+ssl -->
<!-- 仅针对tcp或nio -->
<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:5671?auto.protocols=default&maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
//只要端口好写对,会自动检查协议的
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.1.3:5671");
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("nio://192.168.1.3:5671");