ActiveMQ 支持哪些传输协议?它们有什么区别?

ActiveMQ 支持多种传输协议,主要有:

  1. TCP:默认的传输协议,使用TCP Socket进行传输,性能较高。
  2. NIO:使用Java NIO进行传输,可以实现较高的消息吞吐量。
  3. SSL:TCP协议的安全版本,使用SSL实现加密传输。
  4. STOMP:Simple (or Streaming) Text Orientated Messaging Protocol,文本定向消息传递协议。支持多语言客户端。
  5. WebSocket:支持WebSocket协议,允许客户端使用JavaScript通过浏览器与服务器进行全双工通信。
  6. AMQP:高级消息队列协议,与RabbitMQ互operable,用于不同的消息中间件之间传输消息。

这些协议的主要区别在于:

  1. 性能:TCP和NIO性能较高,STOMP、AMQP和WebSocket性能相对较低。
  2. 跨语言:STOMP、AMQP和WebSocket支持跨多种语言,TCP和NIO主要适用于Java。
  3. 编程难易度:STOMP、AMQP和WebSocket较易于编程,TCP和NIO需要直接对socket进行编程,难度较大。
  4. 标准规范:STOMP、AMQP和WebSocket均基于标准协议,更容易兼容其他消息中间件产品。
  5. 安全性:SSL协议通过加密实现安全传输,其他协议需要另外增加安全机制。

例如:

使用TCP协议:

<transportConnector name="tcp" uri="tcp://localhost:61616" /> 

使用NIO协议:

<transportConnector name="nio" uri="nio://localhost:61618" />

使用STOMP协议:

<transportConnector name="stomp" uri="stomp://localhost:61613"/>

STOMP的生产者:

public void run() throws JMSException {  
    // 连接工厂 
    StompConnectionFactory factory = new StompConnectionFactory();
    factory.setBrokerURL("tcp://localhost:61613");
    // 连接 
    StompConnection conn = factory.createConnection();
    // 启动
    conn.start();  
    // 创建会话
    StompSession session = conn.createSession();
    // 目标 
    Topic dest = new Topic("/topic/test");  
    // 创建生产者 
    StompProducer producer = session.createProducer(dest);
    // 发送消息
    producer.send("Hello from STOMP!");
    // 关闭 
    conn.close();
}

STOMP的消费者:

public void run() throws JMSException {
    // 连接工厂
    StompConnectionFactory factory = new StompConnectionFactory();
    factory.setBrokerURL("tcp://localhost:61613");
    // 连接 
    StompConnection connection = factory.createConnection();
    // 启动
    connection.start();
    // 创建会话
    StompSession session = connection.createSession();
    // 目标
    Topic dest = new Topic("/topic/test");  
    // 创建消费者
    StompConsumer consumer = session.createConsumer(dest);
    // 监听器
    consumer.setMessageListener(new MessageListener() {
      public void onMessage(Message msg) {
        try {
          System.out.println("Received: " + ((StompTextMessage) msg).getText());
        } catch (JMSException ex) { }  
      }
    });
    // 等待键盘输入 
    System.in.read();  
    // 关闭
    connection.close();  
}

总体来说,选择何种协议需要根据实际应用场景进行权衡。一般来说,生产环境下会考虑使用TCP或NIO协议,开发过程中会选择STOMP或AMQP协议方便编程。