ActiveMQ支持的協議


一、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模型傳輸數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM