ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、Http(s)、VM。
其中配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中的标签之内。
Transmission Control Protocol(TCP)协议
1.这是默认的Broker配置,TCP的Client监听端口61616
2.在网络传输数据前,必须要先序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。
3.TCP连接的URI形式如:tcp://HostName:port?key=value&key=value,后面的参数是可选的。
4.TCP传输的的优点:
(4.1)TCP协议传输可靠性高,稳定性强
(4.2)高效率:字节流方式传递,效率很高
(4.3)有效性、可用性:应用广泛,支持任何平台
5.关于Transport协议的可选配置参数可以参考官网http://activemq.apache.org/configuring-version-5-transports.html
New I/O API Protocol(NIO)协议
1.NIO协议和TCP协议类似,但NIO更侧重于底层的访问操作。它允许开发人员对同一资源可有更多的client调用和服务器端有更多的负载。
2.适合使用NIO协议的场景:
(2.1)可能有大量的Client去连接到Broker上,一般情况下,大量的Client去连接Broker是被操作系统的线程所限制的。因此,NIO的实现比TCP需要更少的线程去运行,所以建议使用NIO协议。
(2.2)可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能。
3.NIO连接的URI形式:nio://hostname:port?key=value&key=value
4.关于Transport协议的可选配置参数可以参考官网http://activemq.apache.org/configuring-version-5-transports.html
小结
TCP默认的协议,性能相对可以
NIO基于TCP协议之上的,进行类扩展和优化,具有更高的性能
NIO案例演示
1,修改activemq.xml配置文件
<transportConnectors>
<transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true" />
</transportConnectors>
如果你不特别指定ActiveMQ的网络监听端口,那么这些端口都讲使用BIO网络IO模型
所以为了首先提高单节点的网络吞吐性能,我们需要明确指定ActiveMQ网络IO模型。
如下所示:URI格式头以“nio”开头,表示这个端口使用以TCP协议为基础的NIO网络IO模型。
测试nio
生产者,消费者两端协议代码修改
生产者
package com.mq.nio;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息生产者
*/
public class JmsProduce {
public static final String ACTIVEMQ_URL = "nio://127.0.0.1:61618/";
public static final String QUEUE_NAME = "Transport";
public static void main(String[] args) throws JMSException {
//创建工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//通过连接工厂获得连接connection并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话 参数 1事务 2签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建目的地 是队列还是主题topic
Queue queue = session.createQueue(QUEUE_NAME);
//创建消失生产者
MessageProducer messageProducer = session.createProducer(queue);
// messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //非持久化
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT); //持久话
//通过messageProducer给mq发送消息
for(int i = 1;i<=3;i++){
//创建消息 里面放消息内容
TextMessage textMessage = session.createTextMessage("textMessage---" + i);
//设置唯一标识
textMessage.setStringProperty("c01","vip");
//通过messageProducer发送给mq
messageProducer.send(textMessage);
}
//关闭支援
messageProducer.close();
session.close();
connection.close();
System.out.println("****消息发送给mq****");
}
}
消费者
package com.mq.nio;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息消费者,同步阻塞方式
*/
public class JmsConsumerDemo01 {
public static final String ACTIVEMQ_URL = "nio://127.0.0.1:61618/";
public static final String QUEUE_NAME = "Transport";
public static void main(String[] args) throws JMSException {
System.out.println("2号消费者");
//创建工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//通过连接工厂获得连接connection并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建会话 参数 1事务 2签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建目的地 是队列还是主题topic
Queue queue = session.createQueue(QUEUE_NAME);
//创建消费者
//从指定的队列中取消息
MessageConsumer messageConsumer = session.createConsumer(queue);
/**
* 同步阻塞方式(.receive())
* 订阅者或接受者messageConsumer的.receive()方法来接收消息
* .receive()方法在能够接收到消息之前一直阻塞
*/
while (true){
//.receive() 一直等待mq中的消息
TextMessage textMessage = (TextMessage)messageConsumer.receive();
if(null != textMessage){
System.out.println("******收到消息"+textMessage.getText());
}else {
break;
}
}
messageConsumer.close();
session.close();
connection.close();
}
}
结果
nio性能优化
上述代码问题
URL格式以NIO开头,代表这个端口使用TCP协议为基础的NIO网络模式。但是这样的设置方式,只能使这个端口支持Openwire协议.
我们怎么能让这个端口即支持NIO网络模型,又让他支持多个协议?
解决:
1,使用auto关键字
<transportConnector name="auto+nio" uri="auto+nio://localhost:5671"/>
2,使用“+”符号来为端口设置多种特性
3,如果我们即需要使用莫一个端口支持NIO网络模型,又需要他支持多个协议
<transportConnector name="auto+nio" uri="auto+nio://localhost:5671"/>