ActiveMQ Artemis配置MySQL JDBC持久化后消息未存储问题求助
确认MQTT消息的QoS级别:MQTT协议中仅QoS=1或QoS=2的消息会触发持久化逻辑,若发送时使用默认QoS=0,消息不会写入数据库。测试时强制指定QoS为1或2再发送。
检查地址的持久化配置:确保目标MQTT地址(对应Artemis的address)开启了持久化。在
broker.xml的<address-settings>中验证:<address-settings> <address-setting match="#"> <persistence-enabled>true</persistence-enabled> </address-setting> </address-settings>若存在针对特定MQTT主题的单独配置,需确保其
persistence-enabled属性为true。验证JDBC存储的全局配置:确认
broker.xml中全局持久化配置正确指向JDBC,且无文件存储冲突:<persistence-enabled>true</persistence-enabled> <journal-type>JDBC</journal-type> <!-- 必须设置为JDBC --> <jdbc-store> <data-source-name>你的数据源名称</data-source-name> <message-table-name>你的消息表名</message-table-name> <!-- 确保与数据库表名一致,注意大小写敏感 --> <!-- 其他JDBC配置项 --> </jdbc-store>彻底移除或注释所有文件存储相关配置(如
journal-directory、bindings-directory等),避免Artemis fallback到文件存储。检查数据库表结构与权限:确保
message-table-name对应的表结构符合Artemis要求(可由Artemis自动初始化,或按官方DDL创建),且Artemis使用的数据库账号拥有该表的写入权限。查看Artemis启动日志,确认无SQL写入异常。测试无订阅场景下的持久化:发送QoS=1的MQTT消息后立即停止Broker,重启后尝试订阅该主题。若能收到消息说明持久化生效;若消息丢失,排查日志中是否有“消息未持久化”相关提示。
排查消息自动清理规则:检查地址配置中的
purge-on-no-consumers、auto-delete-queues等参数,确保无规则导致无订阅时消息被自动清理。例如:<address-setting match="your-mqtt-topic"> <purge-on-no-consumers>false</purge-on-no-consumers> <!-- 设为false避免无订阅时清理消息 --> </address-setting>
内容的提问来源于stack exchange,提问作者GFTXWD

