ActiveMQ专题9 —— ActiveMQ的传输协议

前言

如果你只是为了解在项目中如何使用activemq,以便工作中快速上手,那么前面七篇文章足矣
ActiveMQ专题0 —— 前言说明
ActiveMQ专题1 —— 入门概述
ActiveMQ专题2 —— ActiveMQ下载和安装(Linux版)
ActiveMQ专题3 ——Java编码实现ActiveMQ通讯(Queue)
ActiveMQ专题4 ——ActiveMQ专题4 ——Java编码实现ActiveMQ通讯(Topic)
ActiveMQ专题5 ——JMS规范和落地产品
ActiveMQ专题6 ——ActiveMQ的Broker
ActiveMQ专题7 —— Spring整合ActiveMQ
ActiveMQ专题8 —— SpringBoot整合ActiveMQ
如 果 你 需 要 应 付 面 试 , 提 升 自 己 , 拿 到 更 好 的 薪 资 , 那 么 你 可 以 继 续 往 下 学 习 \color{red}如果你需要应付面试,提升自己,拿到更好的薪资,那么你可以继续往下学习

体会面试题

在这里插入图片描述
上图是Java入门程序写过的代码
在这里插入图片描述

查看官网

官网地址
在这里插入图片描述

怎么知道activemq默认是tcp协议,如何查看

打开ActiveMQ安装目录所在的/conf/activemq.xml找到transportConnectors标签,内容如下:

<transportConnectors>
	<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

在这里插入图片描述

由配置可知MQ的各种协议URL配置格式以及默认端口。

脚下留心

在上文给出的配置信息中,
URI描述信息的头部都是采用协议名称:例如
描述amqp协议的监听端口时,采用的URI描述格式为“amqp://······”;
描述Stomp协议的监听端口时,采用URI描述格式为“stomp://······”;
唯独在进行openwire协议描述时,URI头却采用的“tcp://······”。
除 了 T C P 协 议 外 , 其 他 协 议 的 n a m e 属 性 值 都 和 协 议 本 身 的 名 称 一 致 , 为 何 T C P 协 议 的 n a m e 属 性 值 为 o p e n w i r e ? \color{red}除了TCP协议外,其他协议的name属性值都和协议本身的名称一致,为何TCP协议的name属性值为openwire?TCPnameTCPnameopenwire

因 为 A c t i v e M Q 的 默 认 消 息 协 议 引 用 就 是 o p e n w i r e , 所 以 其 默 认 协 议 T C P 和 默 认 端 口 61616 由 此 而 来 。 \color{red}因为ActiveMQ的默认消息协议引用就是openwire,所以其默认协议TCP和默认端口61616由此而来。ActiveMQopenwireTCP61616
那 么 接 下 来 让 我 们 好 好 学 习 一 下 a c t i v e m q 协 议 \color{red}那么接下来让我们好好学习一下activemq协议activemq

协议种类

TCP(Transmission Control Protocol)

  1. TCP是Broker默认配置的协议,默认监听端口是61616。 在网络传输数据前,必须要先序列化数据,消息是通过一个叫wireprotocol的来序列化成字节流。默认情况下,ActiveMQ把wireprotocol叫做OpenWire,它的目的是促使网络上的效率和数据快速交互。
  2. TCP连接的URI形式如:tcp://HostName:port?key=value&key=value,后面的参数是可选的
  3. TCP传输的的优点:

TCP协议传输可靠性高,稳定性强 高效率:
字节流方式传递,效率很高
有效性、可用性:应用广泛,支持任何平台

NIO(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

AMQP(Advanced Message Queuing Protocol)

Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件限制。
在这里插入图片描述

STOMP(Streaming Text Orientation Message Protocol)

STOP,Streaming Text Orientation Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息中间件)设计的简单文本协议。
在这里插入图片描述

SSL(Secure Sockets Layer Protocol)

  1. SSL传输允许客户端使用TCP上的SSL连接到远程ActiveMQ代理。SSL传输允许客户端使用TCP套接字上的SSL连接到远程ActiveMQ代理。
  2. 连接的URL形式: ssl://hostname:port?key=value
    在这里插入图片描述

MQTT(Message Queuing Telemetry Transport)

MQTT,即消息队列遥测传输,是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当作传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
可 能 会 报 错 \color{red}可能会报错
原 因 是 : 依 赖 包 和 底 层 改 变 了 \color{red}原因是:依赖包和底层改变了

VM

  1. VM本身不是协议。VM传输允许客户机在VM内部彼此连接,而不需要网络通信的开销。所使用的连接不是套接字连接,而是使用直接方法调用来启用高性能嵌入式消息传递系统。
  2. 第一个使用VM连接的客户机将引导一个嵌入式代理。后续的连接将连接到同一代理。一旦所有到代理的VM连接都关闭了,嵌入式代理将自动关闭。

小总结

除 了 T C P 和 N I O , 其 他 在 生 产 用 得 特 别 少 , 可 忽 略 \color{red}除了TCP和NIO,其他在生产用得特别少,可忽略TCPNIO
在这里插入图片描述

Nio案例演示

打开ActiveMQ安装目录所在的/conf/activemq.xml找到transportConnectors标签,内容如下:

<transportConnectors>
      <transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true" />
</transportConnectors>

在这里插入图片描述
重启activemq

在这里插入图片描述
重新测试以前tcp的代码,测试成功
在这里插入图片描述

将activemq的连接地址改为

public static final String ACTIVEMQ_URL = "nio://47.98.163.118:61618";

在这里插入图片描述
重新测试,也是能生产和消费

至 此 , 我 们 的 n i o 整 合 完 毕 \color{red}至此,我们的nio整合完毕nio

nio案例演示增强

目的

上面是Openwire协议传输底层使用NIO网络IO模型。 如何让其他协议传输底层也使用NIO网络IO模型呢?
在这里插入图片描述
大 白 话 理 解 就 是 : 在 此 之 间 T C P 使 用 61616 端 口 , 而 n i o 使 用 61618 端 口 , 每 次 切 换 N I O 和 T C P 时 需 要 更 换 端 口 , 该 如 何 解 决 \color{red}大白话理解就是:在此之间TCP使用61616端口,而nio使用61618端口,每次切换NIO和TCP时需要更换端口,该如何解决TCP使61616nio使61618NIOTCP
解决方法
在这里插入图片描述
在这里插入图片描述

操作步骤

  1. 修改配置文件activemq.xml
 <transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600&amp;org.apache.activemq.transport.nio.SelectorManager.corePoolSize=20&amp;org.apache.activemq.transport.nio.Se1ectorManager.maximumPoo1Size=50"/>

在这里插入图片描述
2. 测试

public static final String ACTIVEMQ_URL = "nio://47.98.163.118:61608";
public static final String ACTIVEMQ_URL = "tcp://47.98.163.118:61608";

现 在 切 换 协 议 , 不 需 要 改 端 口 了 \color{red}现在切换协议,不需要改端口了
在这里插入图片描述

连更文章

ActiveMQ专题0 —— 前言说明
ActiveMQ专题1 —— 入门概述
ActiveMQ专题2 —— ActiveMQ下载和安装(Linux版)
ActiveMQ专题3 ——Java编码实现ActiveMQ通讯(Queue)
ActiveMQ专题4 ——ActiveMQ专题4 ——Java编码实现ActiveMQ通讯(Topic)
ActiveMQ专题5 ——JMS规范和落地产品
ActiveMQ专题6 ——ActiveMQ的Broker
ActiveMQ专题7 —— Spring整合ActiveMQ
ActiveMQ专题8 —— SpringBoot整合ActiveMQ
ActiveMQ专题9 —— ActiveMQ的传输协议
ActiveMQ专题10 —— ActiveMQ的存储和持久化
ActiveMQ专题11 —— ActiveMQ的存储和持久化2 (续篇)
ActiveMQ专题12—— ActiveMQ之zookeeper集群
ActiveMQ专题13—— ActiveMQ高级特性
ActiveMQ专题14—— ActiveMQ高级特性2
$\color{red} 完结!后续推上有关消息队列的面试题目 $

小总结

知 道 的 越 多 , 不 知 道 的 越 多 , 希 望 对 你 有 帮 助 ! \color{red}知道的越多,不知道的越多,希望对你有帮助!


版权声明:本文为xiaozhegaa原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。