一、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模型传输数据