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、生产者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @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、消费者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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模型呢?
1 | <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模型传输数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?