ActiveMQ Artemis 2.23.1重启触发NumberFormatException求根因及规避
ActiveMQ Artemis 2.23.1重启初始化失败问题求助
我使用ActiveMQ Artemis 2.23.1版本,重启服务后出现初始化失败错误,报错栈如下:
2022-08-05 10:09:33,954 ERROR [org.apache.activemq.artemis.core.server] AMQ224000: Failure in initialisation: java.lang.NumberFormatException: For input string: "ID:ccd0bbcb-0db0-11ed-b640-00505685831b" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) [java.base:] at java.base/java.lang.Long.parseLong(Long.java:692) [java.base:] at java.base/java.lang.Long.parseLong(Long.java:817) [java.base:] at org.apache.activemq.artemis.utils.collections.TypedProperties.getLongProperty(TypedProperties.java:258) [artemis-commons-2.23.1.jar:] at org.apache.activemq.artemis.core.message.impl.CoreMessage.getLongProperty(CoreMessage.java:1004) [artemis-core-client-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.core.persistence.impl.journal.JournalStorageManager.parseLargeMessage(JournalStorageManager.java:372) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.core.persistence.impl.journal.AbstractJournalStorageManager.lambda$loadMessageJournal$3(AbstractJournalStorageManager.java:966) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.utils.collections.SparseArrayLinkedList$SparseArray.clear(SparseArrayLinkedList.java:114) [artemis-commons-2.23.1.jar:] at org.apache.activemq.artemis.utils.collections.SparseArrayLinkedList.clearSparseArrayList(SparseArrayLinkedList.java:173) [artemis-commons-2.23.1.jar:] at org.apache.activemq.artemis.utils.collections.SparseArrayLinkedList.clear(SparseArrayLinkedList.java:227) [artemis-commons-2.23.1.jar:] at org.apache.activemq.artemis.core.persistence.impl.journal.AbstractJournalStorageManager.loadMessageJournal(AbstractJournalStorageManager.java:935) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.loadJournals(ActiveMQServerImpl.java:3606) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.initialisePart2(ActiveMQServerImpl.java:3269) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.core.server.impl.LiveOnlyActivation.run(LiveOnlyActivation.java:76) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.internalStart(ActiveMQServerImpl.java:663) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.start(ActiveMQServerImpl.java:571) [artemis-server-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.integration.FileBroker.start(FileBroker.java:64) [artemis-cli-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.cli.commands.Run.execute(Run.java:127) [artemis-cli-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.cli.Artemis.internalExecute(Artemis.java:160) [artemis-cli-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:108) [artemis-cli-2.23.1.jar:2.23.1] at org.apache.activemq.artemis.cli.Artemis.execute(Artemis.java:135) [artemis-cli-2.23.1.jar:2.23.1] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [java.base:] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [java.base:] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [java.base:] at java.base/java.lang.reflect.Method.invoke(Method.java:566) [java.base:] at org.apache.activemq.artemis.boot.Artemis.execute(Artemis.java:134) [artemis-boot.jar:2.23.1] at org.apache.activemq.artemis.boot.Artemis.main(Artemis.java:50) [artemis-boot.jar:2.23.1]
此前在Stack Overflow上Justin Bertram协助我删除损坏消息恢复了数据,但未找到问题根因。现求助:是否有人遇到过该问题?如何在未来规避此类错误?
已定位到损坏消息,将其加载到干净的ActiveMQ Artemis实例中时,在value="ID:ccd0bbcb-0db0-11ed-b640-00505685831b"处触发错误,该消息内容如下:
<activemq-journal> <bindings> <address-binding routing-types="ANYCAST" name="INT.TEST.PF.CREATE.RESP.ERR" id="2172626911"/> <queue-binding address="INT.TEST.PF.CREATE.RESP.ERR" filter-string="" name="INT.TEST.PF.CREATE.RESP.ERR" id="2172626912" routing-type="ANYCAST"/> </bindings> <messages> <message id="2172626917" priority="4" expiration="0" timestamp="1658928854636" type="bytes" user-id="ce631ba7-0db0-11ed-ad0e-00505685eec9"> <properties> <property name="_AMQ_ROUTING_TYPE" value="1" type="byte"/> <property name="PFFileName" value="2022-07-27T16:34:11.925123.pdf" type="simple-string"/> <property name="PFSystemName" value="TEST_REG" type="simple-string"/> <property name="JMSCorrelationID" value="ID:cae19602-0db0-11ed-ad0e-00505685eec9" type="simple-string"/> <property name="_AMQ_VALIDATED_USER" value="test-pf-acc" type="simple-string"/> <property name="_AMQ_ORIG_MESSAGE_ID" value="ID:ccd0bbcb-0db0-11ed-b640-00505685831b" type="simple-string"/> <property name="PFProcessId" value="f59fb998-7b58-4448-9bc6-6327eaefb243_0:1" type="simple-string"/> <property name="_AMQ_LARGE_SIZE" value="121886" type="long"/> <property name="traceparent" value="00-00000000000000006a2fc50eb4583663-becee71cc630eb5b-01" type="simple-string"/> <property name="__AMQ_CID" value="c7910b66-0db0-11ed-ad0e-00505685eec9" type="simple-string"/> <property name="baggage" value="sessionId=2ababb61-48fa-43b0-8a31-a17a9a57939c" type="simple-string"/> <property name="JMSXDeliveryCount" value="0" type="long"/> <property name="_AMQ_ORIG_QUEUE" value="INT.TEST.PF.CREATE.RESP" type="simple-string"/> <property name="_AMQ_ORIG_ADDRESS" value="INT.TEST.PF.CREATE.RESP" type="simple-string"/> </properties> <queues> <queue name="INT.TEST.PF.CREATE.RESP.ERR"/> </queues> <body isLarge="true"> </body> </message> </messages> </activemq-journal>
问题分析与规避方案
根因定位
从报错栈和损坏消息内容来看,核心问题是JournalStorageManager.parseLargeMessage方法尝试将_AMQ_ORIG_MESSAGE_ID属性的值当作Long类型解析,但该属性实际是字符串格式的消息ID(ID:ccd0bbcb-0db0-11ed-b640-00505685831b),直接触发NumberFormatException。
本质是消息持久化时属性类型标识出错——本该标记为simple-string的_AMQ_ORIG_MESSAGE_ID,在journal文件中被错误标记为long类型,导致重启加载时解析失败。
规避措施
- 升级Artemis版本:该问题属于产品已知bug,后续版本(如2.24.0及以上)修复了消息属性类型持久化的校验逻辑,可从根源避免此类错误。
- 启用journal校验机制:在
broker.xml中配置journal校验参数,启动时自动检测并跳过损坏消息:<journal> <journal-directory>data/journal</journal-directory> <journal-type>NIO</journal-type> <check-for-corruption>true</check-for-corruption> <checksum-journal>true</checksum-journal> </journal> - 规范服务关闭流程:使用官方
stop命令正常关闭Artemis服务,禁止强制杀死进程,避免journal文件写入中断导致数据损坏。 - 定期备份journal目录:定期备份journal存储目录,出现损坏时可快速恢复到正常状态,降低业务影响。
- 严格控制消息属性:生产者端避免使用Artemis内部保留属性名(如
_AMQ_前缀),同时严格校验自定义属性的类型,防止类型冲突。
内容的提问来源于stack exchange,提问作者Faringot
相关产品推荐
相关产品推荐

