Artemis 2.21.0结合PostgreSQL存储时出现AMQ224011等错误求助
问题分析:ActiveMQ Artemis 2.21.0 + PostgreSQL 存储相关错误排查
环境与问题现象
使用Artemis 2.21.0版本,消息存储在PostgreSQL数据库中,近期出现以下错误:
11:17:09.638 [http-nio-8080-exec-24] ERROR org.apache.activemq.artemis.core.server - AMQ224011: Cannot find queue messages 3 for message 191,140,297,440 while processing scheduled messages 11:17:09.638 [http-nio-8080-exec-24] ERROR org.apache.activemq.artemis.core.server - AMQ224011: Cannot find queue messages 3 for message 191,140,297,441 while processing scheduled messages 11:17:09.638 [http-nio-8080-exec-24] ERROR org.apache.activemq.artemis.core.server - AMQ224011: Cannot find queue messages 3 for message 191,140,297,441 while processing scheduled messages 11:17:09.638 [http-nio-8080-exec-24] ERROR org.apache.activemq.artemis.core.server - AMQ224011: Cannot find queue messages 3 for message 191,140,297,445 while processing scheduled messages
相关配置
broker.xml中的地址设置:
<address-settings> <address-setting match="#"> <max-delivery-attempts>2</max-delivery-attempts> <redelivery-delay>1000</redelivery-delay> <max-size-bytes>104857600</max-size-bytes> <page-size-bytes>10485760</page-size-bytes> <address-full-policy>PAGE</address-full-policy> </address-setting> <address-setting match="dataQueue1"> <dead-letter-address>deadLetterQueue1</dead-letter-address> <expiry-delay>604800000</expiry-delay> <!-- one week --> </address-setting> <address-setting match="dataQueue2"> <dead-letter-address>deadLetterQueue2</dead-letter-address> <expiry-delay>604800000</expiry-delay> <!-- one week --> </address-setting> </address-settings>
未显式配置global-max-size,默认使用JVM堆内存的一半:
AMQ221057: Global Max Size is being adjusted to 1/2 of the JVM max size (-Xmx). being defined as 8,564,768,768
启动时的错误日志
[WARN ] 2023-05-12 18:58:34.708 [RMI TCP Connection(3)-127.0.0.1] server - AMQ222010: Critical IO Error, shutting down the server. file=org.apache.activemq.artemis.jdbc.store.file.JDBCSequentialFile@15560d14, message=Error attempting to open JDBC file. org.postgresql.util.PSQLException: ERROR: permission denied for large object 1635180 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.core.v3.QueryExecutorImpl.receiveFastpathResult(QueryExecutorImpl.java:766) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.core.v3.QueryExecutorImpl.fastpathCall(QueryExecutorImpl.java:558) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:105) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.fastpath.Fastpath.fastpath(Fastpath.java:146) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.fastpath.Fastpath.getInteger(Fastpath.java:158) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.largeobject.LargeObject.<init>(LargeObject.java:102) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.largeobject.LargeObjectManager.open(LargeObjectManager.java:257) ~[postgresql-42.2.5.jar:42.2.5] at org.postgresql.largeobject.LargeObjectManager.open(LargeObjectManager.java:240) ~[postgresql-42.2.5.jar:42.2.5] at org.apache.activemq.artemis.jdbc.store.file.PostgresLargeObjectManager.open(PostgresLargeObjectManager.java:83) ~[artemis-jdbc-store-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jdbc.store.file.PostgresSequentialSequentialFileDriver.getPostGresLargeObjectSize(PostgresSequentialSequentialFileDriver.java:186) ~[artemis-jdbc-store-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jdbc.store.file.PostgresSequentialSequentialFileDriver.loadFile(PostgresSequentialSequentialFileDriver.java:92) ~[artemis-jdbc-store-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jdbc.store.file.JDBCSequentialFileFactoryDriver.openFile(JDBCSequentialFileFactoryDriver.java:112) ~[artemis-jdbc-store-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jdbc.store.file.JDBCSequentialFile.load(JDBCSequentialFile.java:110) ~[artemis-jdbc-store-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jdbc.store.file.JDBCSequentialFile.open(JDBCSequentialFile.java:104) ~[artemis-jdbc-store-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.core.paging.impl.PagingStoreFactoryDatabase.reloadStores(PagingStoreFactoryDatabase.java:220) ~[artemis-server-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.core.paging.impl.PagingManagerImpl.reloadStores(PagingManagerImpl.java:352) ~[artemis-server-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.core.paging.impl.PagingManagerImpl.start(PagingManagerImpl.java:456) ~[artemis-server-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.initialisePart1(ActiveMQServerImpl.java:3196) ~[artemis-server-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.core.server.impl.LiveOnlyActivation.run(LiveOnlyActivation.java:68) ~[artemis-server-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.internalStart(ActiveMQServerImpl.java:663) ~[artemis-server-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.start(ActiveMQServerImpl.java:571) ~[artemis-server-2.21.0.jar:2.21.0]
启动成功日志
尽管有上述错误,服务器仍启动成功:
[INFO ] 2023-05-12 18:58:40.661 [RMI TCP Connection(3)-127.0.0.1] server - AMQ221034: Waiting 60000 milliseconds to obtain live lock [INFO ] 2023-05-12 18:58:40.661 [RMI TCP Connection(3)-127.0.0.1] server - AMQ221035: Live Server Obtained live lock [INFO ] 2023-05-12 18:58:49.259 [RMI TCP Connection(3)-127.0.0.1] load - activationComplete called [INFO ] 2023-05-12 18:58:49.259 [RMI TCP Connection(3)-127.0.0.1] server - AMQ221007: Server is now live
创建SessionFactory时的错误
后续创建SessionFactory抛出异常:
javax.jms.JMSRuntimeException: Failed to create session factory at org.apache.activemq.artemis.jms.client.JmsExceptionUtils.convertToRuntimeException(JmsExceptionUtils.java:88) ~[artemis-jms-client-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createContext(ActiveMQConnectionFactory.java:311) ~[artemis-jms-client-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createContext(ActiveMQConnectionFactory.java:299) ~[artemis-jms-client-2.21.0.jar:2.21.0] at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createContext(ActiveMQConnectionFactory.java:289) ~[artemis-jms-client-2.21.0.jar:2.21.0]
原因分析
- PostgreSQL大对象权限问题:启动时的核心错误是
permission denied for large object 1635180,说明Artemis使用的数据库账号没有访问该大对象的权限。Artemis在使用PostgreSQL存储时,会将分页数据、消息内容等存储为PostgreSQL大对象,若账号权限不足,会导致无法读取或写入这些对象。 - 数据一致性损坏:
AMQ224011错误表明服务器处理调度消息时,找不到对应的队列消息记录。这很可能是因为启动时无法读取大对象中的分页数据,导致内存中的元数据与数据库实际存储不一致,后续处理调度消息时出现数据缺失。 - 启动流程的容错性:尽管启动时出现了IO错误,但Artemis的启动流程没有直接终止,而是继续完成启动,这导致后续操作(如创建SessionFactory)因为底层存储的问题而失败。
解决方案
- 修复数据库权限:给Artemis使用的PostgreSQL账号授予大对象的访问权限,执行以下SQL:
GRANT ALL ON LARGE OBJECT 1635180 TO your_artemis_user; -- 若存在多个权限不足的大对象,可批量授予: GRANT ALL ON ALL LARGE OBJECTS IN SCHEMA public TO your_artemis_user; - 检查存储完整性:停止Artemis服务,备份数据库后,检查PostgreSQL中的Artemis相关表(如
artemis_messages、artemis_large_messages等)和大对象是否存在损坏,必要时清理损坏的分页数据或消息记录。 - 升级Artemis版本:Artemis 2.21.0存在一些JDBC存储相关的已知问题,升级到较新的稳定版本(如2.30.x或更高)可修复部分权限处理和存储一致性问题。
- 调整权限策略:确保PostgreSQL账号拥有足够的权限管理大对象,避免后续出现类似权限问题。
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

