MQTT

连接性 > 协议 > MQTT

ActiveMQ Classic 支持 MQTT 协议,并将自动在 JMS/NMS 和 MQTT 客户端之间进行映射。MQTT 是一种机器对机器 (M2M) 发布/订阅消息传输。

有关更多详细信息,请参见 MQTT 网站

支持的版本

ActiveMQ Classic 支持 MQTT v3.1.1v3.1

为 MQTT 启用 ActiveMQ Classic 代理

为 MQTT 启用 ActiveMQ Classic 很容易。只需使用 MQTT URL 将连接器添加到代理即可。

<transportConnectors>
   <transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883"/>
</transportConnectors>

MQTT 线程格式

MQTT 使用紧凑的二进制格式,可以使用以下选项配置。所有选项都可以在代理的传输绑定 URI 上配置。

参数名称 默认值 描述
maxFrameSize 268435456 (v5.12.0) 可以发送的最大帧大小。协议限制为 256 兆字节,此值不能设置得更高。可以帮助防止 OOM DOS 攻击

所有选项必须在前面加上 wireFormat 才能生效。如果没有这种正确的格式,该选项将不起作用。

示例线框格式配置

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:61612?wireFormat.maxFrameSize=100000"/>

安全

ActiveMQ Classic MQTT 传输实现完全支持 ActiveMQ Classic 安全 机制。此外,当您尝试访问 (读取/写入) 某些目标时,将应用授权策略。

在 NIO 上启用 MQTT

为了获得更好的可扩展性(和性能),您可能希望在 NIO 传输上运行 MQTT 协议。为此,只需使用 mqtt+nio 传输前缀,而不是 mqtt。例如,在您的 XML 文件中添加以下传输配置

<transportConnector name="mqtt+nio" uri="mqtt+nio://127.0.0.1:1883"/>

此传输使用 NIO 传输,通常比标准连接器使用更少的线程。

在 NIO + SSL 上启用 MQTT

MQTT 传输还支持使用 NIO 和 SSL。要启用此选项,请使用 mqtt+nio+ssl 协议 - 例如

<transportConnector name="mqtt+nio" uri="mqtt+nio+ssl://127.0.0.1:1883"/>
  • 有关在 ActiveMQ Classic 中使用 SSL 的更多详细信息,请参阅以下文章 (如何使用 SSL)。

使用 MQTT 与目标一起使用

MQTT 支持层次结构和通配符,尽管分隔符和字符不同:- 以下是映射

功能 ActiveMQ Classic MQTT
分隔符 . /
元素 * +
子树 > #

这些值会自动在使用 JMS/NMS/Stomp 的客户端和使用 MQTTT 的客户端之间转换。例如 - 订阅“foo/#/bar”的客户端将接收发布到 foo.blah.bar 的 JMS 主题上的消息。

消息转换

MQTT 消息被转换为 JMS ByteMessage。相反,任何 JMS 消息的主体都被转换为字节缓冲区,以成为 MQTT 消息的有效负载。

保持活动

当客户端连接时,它将发送一个保持活动持续时间,通常默认为 10 秒。ActiveMQ Classic 将通过设置一个允许 1.5 * 持续时间的空闲监视器来遵守保持活动持续时间。在该宽限期持续时间过去后,如果没有任何活动,连接可能会被关闭。代理接收 PINGREQ 并发送 PINGRESP 被视为活动,以保持连接打开。

如果客户端发送一个保持活动值为 0,ActiveMQ Classic 将不会设置一个 空闲监视器,并且连接将不会由于空闲而自动关闭。但是,这可能会导致潜在的泄漏连接,因此可以在服务器端(例如,由管理员)设置默认保持活动,以不允许空闲连接挂起。此默认保持活动仅在指定且客户端请求保持活动值为 0 时才会使用。保持活动值的单位是毫秒。

要启用默认的服务器端 MQTT 保持活动

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?transport.defaultKeepAlive=60000"/>

消息预取

当 MQTT 客户端连接时,它会在本地创建类似 JMS 的消费者到代理。在旧版本中,此消费者是使用预取大小为 1 创建的(消息预取在 此处 有更详细的解释)。从 5.11.0 版本开始,预取大小将调整为相应 JMS 订阅的默认值。QoS=0 订阅的默认预取是常规的非持久主题订阅,而 QoS=1 和 QoS=2 被分配了持久订阅者或队列订阅的预取大小,具体取决于所使用的订阅策略(有关更多详细信息,请参见下一节)。默认预取值列在 此处

要更改预取大小的默认值,可以使用 activeMQSubscriptionPrefetch 传输选项,例如

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?transport.activeMQSubscriptionPrefetch=32766"/>

订阅策略

ActiveMQ Classic 在其核心是一个 JMS 代理,因此需要在 MQTT 订阅和 JMS 语义之间进行一些映射。QoS=0(最多一次)的订阅直接映射到普通的 JMS 非持久主题。对于可靠的消息传递,QoS=1 和 QoS=2,默认情况下订阅会被转换为 JMS 持久主题订阅者。这种行为在大多数场景中都是需要的。对于某些用例,将这些订阅映射到 虚拟主题 是很有用的。虚拟主题提供了更好的可扩展性,并且通常是您想要通过代理网络使用 MQTT 订阅者时的更好解决方案。要将订阅策略更改为使用虚拟主题,请使用以下设置

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?transport.subscriptionStrategy=mqtt-virtual-topic-subscriptions"/>

保留消息

如果消息已发布并设置了保留标志,则该消息将被主题“记住”,以便如果新的订阅到达,则上次保留的消息将被发送到订阅。在内部,代理使用 保留消息订阅恢复策略 来保留设置了ActiveMQ.Retain 属性的消息。在消息转换期间,带有保留标志的 MQTT 消息将成为设置了ActiveMQ.Retain 属性的 JMS 消息,并由代理保留。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。