ActiveMQ 支持多种传输协议,主要有:
- TCP:默认的传输协议,使用TCP Socket进行传输,性能较高。
- NIO:使用Java NIO进行传输,可以实现较高的消息吞吐量。
- SSL:TCP协议的安全版本,使用SSL实现加密传输。
- STOMP:Simple (or Streaming) Text Orientated Messaging Protocol,文本定向消息传递协议。支持多语言客户端。
- WebSocket:支持WebSocket协议,允许客户端使用JavaScript通过浏览器与服务器进行全双工通信。
- AMQP:高级消息队列协议,与RabbitMQ互operable,用于不同的消息中间件之间传输消息。
这些协议的主要区别在于:
- 性能:TCP和NIO性能较高,STOMP、AMQP和WebSocket性能相对较低。
- 跨语言:STOMP、AMQP和WebSocket支持跨多种语言,TCP和NIO主要适用于Java。
- 编程难易度:STOMP、AMQP和WebSocket较易于编程,TCP和NIO需要直接对socket进行编程,难度较大。
- 标准规范:STOMP、AMQP和WebSocket均基于标准协议,更容易兼容其他消息中间件产品。
- 安全性: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协议方便编程。