MQTT
ActiveMQ Classic 支持 MQTT 协议,并将自动在 JMS/NMS 和 MQTT 客户端之间进行映射。MQTT 是一种机器对机器 (M2M) 发布/订阅消息传输。
有关更多详细信息,请参见 MQTT 网站
支持的版本
ActiveMQ Classic 支持 MQTT v3.1.1 和 v3.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 消息,并由代理保留。