一、ActiveMQ支持的協議有哪些?
1、ActiveMQ支持的client-broker通訊協議有:TCP、NIO、UDP、SSL、Http(s)、VM.
2、配置Transport Connector的文件在ActiveMQ安裝目錄的conf/activemq.xml中<transportConnectors>標簽之內.
3、activemq傳輸協議的官方文檔:http://activemq.apache.org/configuring-transports.html
4、在上文給出的配置信息中,URI描述信息的頭部都是采用協議名稱.例如:描述amqp協議的監聽端口時,采用的URI描述格式為“amqp://······”;描述Stomp協議的監聽端口時,采用URI描述格式為“stomp://······”;唯獨在進行openwire協議描述時,URI頭卻采用的“tcp://······”.這是因為ActiveMQ中默認的消息協議就是openwire.
5、除了tcp和nio協議,其他的了解就行.各種協議有各自擅長該協議的中間件,工作中一般不會使用activemq去實現這些協議.如:mqtt是物聯網專用協議,采用的中間件一般是mosquito. ws是websocket的協議,是和前端對接常用的,一般在java代碼中內嵌一個基站(中間件).stomp好像是郵箱使用的協議的,各大郵箱公司都有基站(中間件).
注意:協議不同,我們的代碼都會不同.
6、相關協議簡介
二、TCP協議
1、TCP協議Transmission Control Protocol(TCP)是默認的.TCP的Client監聽端口61616
2、在網絡傳輸數據前,必須要先序列化數據,消息是通過一個叫wire protocol的來序列化成字節流.
3、TCP連接的URI形式如:tcp://HostName:port?key=value&key=value,后面的參數是可選的.
4、CP傳輸的的優點:
TCP協議傳輸可靠性高,穩定性強
高效率:字節流方式傳遞,效率很高.
有效性、可用性:應用廣泛,支持任何平台.
5、關於Transport協議的可選配置參數可以參考官網http://activemq.apache.org/tcp-transport-reference
三、NIO(New I/O API Protocol(NIO))
1、NIO協議和TCP協議類似,但NIO更側重於底層的訪問操作.它允許開發人員對同一資源可有更多的client調用和服務器端有更多的負載.
2、適合使用NIO協議的場景:
可能有大量的Client去連接到Broker上,一般情況下,大量的Client去連接Broker是被操作系統的線程所限制的.因此,NIO的實現比TCP需要更少的線程去運行,所以建議使用NIO協議.
可能對於Broker有一個很遲鈍的網絡傳輸,NIO比TCP提供更好的性能.
NIO連接的URI形式:nio://hostname:port?key=value&key=value
3、關於Transport協議的可選配置參數可以參考官網http://activemq.apache.org/configuring-version-5-transports.html
四、NIO協議測試案例
ActiveMQ這些協議傳輸的底層默認都是使用BIO網絡的IO模型。只有當我們指定使用nio才使用NIO的IO模型。ActiveMQ這些協議傳輸的底層默認都是使用BIO網絡的IO模型,只有當我們指定使用nio才使用NIO的IO模型.具體步驟如下:
1、修改activemq.xml配置文件,加上如下配置: <transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true"/>
2、保存后,啟動activeMQ
3、重啟之后,可以看到Connection這里多了一個 Connector nio
4、Spring配置文件
5、生產者
@Service
public class JmsProducer {
@Autowired
private JmsTemplate jmsTemplate;
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/conf/spring/applicationContext.xml");
JmsProducer jmsProducer = (JmsProducer) context.getBean("jmsProducer");
for (int i = 1; i < 7; i++) {
jmsProducer.jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage(
"queue:::" + UUID.randomUUID().toString().replace("-", ""));
return textMessage;
}
});
}
System.out.println("JmsProducer send message ok!!!");
}
}
6、消費者
@Service
public class JmsConsumer {
@Autowired
private JmsTemplate jmsTemplate;
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/conf/spring/applicationContext.xml");
JmsConsumer jmsConsumer = (JmsConsumer) context.getBean("jmsConsumer");
while (true) {
String textMessage = (String) jmsConsumer.jmsTemplate.receiveAndConvert();
System.out.println("接收到的消息是:" + textMessage);
}
}
}
7、后台管理界面
8、控制台
五、NIO協議增強
上面是Openwire協議傳輸底層使用NIO網絡IO模型.如何讓其他協議傳輸底層也使用NIO網絡IO模型呢?
<transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000&wireFormat.maxFrameSize=104857600&org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&org.apache.activemq.transport.nio.Se1ectorManager.maximumPoo1Size=50"/>
auto:它會識別我們使用的是什么協議,然后自己去匹配對應的傳輸協議.
nio:使用NIO網絡,IO模型傳輸數據