AMQ 读取 simpleString 时出错,length=xxx 大于 readableBytes=yyy
AMQ Error reading in simpleString, length=xxx is greater than readableBytes=yyy
我正在尝试解决这个 ActiveMQ Artemis 错误。
似乎偶尔的消息对 SimpleString
来说太大了,没有发送,它转到了 DLQ。
java.lang.IndexOutOfBoundsException: Error reading in simpleString, length=1366648 is greater than readableBytes=127646@ClientLargeMessageImpl[messageID=578576793, durable=true, address=AuthCorrespondence.sendmail,userID=7f72137c-c3a3-11eb-87f7-0242c0a8e003,properties=TypedProperties[__AMQ_CID=b3f70eb1-be3c-11eb-87f7-0242c0a8e003,_AMQ_LARGE_SIZE=127651,_AMQ_ROUTING_TYPE=1]]
at org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.getMessage(ActiveMQMessageConsumer.java:234)
at org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.receive(ActiveMQMessageConsumer.java:132)
at org.springframework.jms.support.destination.JmsDestinationAccessor.receiveFromConsumer(JmsDestinationAccessor.java:130)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:416)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:302)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:255)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1168)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1160)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1057)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IndexOutOfBoundsException: Error reading in simpleString, length=1366648 is greater than readableBytes=127646
at org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:183)
at org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:171)
at org.apache.activemq.artemis.api.core.SimpleString.readNullableSimpleString(SimpleString.java:158)
at org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper.readNullableSimpleString(ChannelBufferWrapper.java:69)
at org.apache.activemq.artemis.reader.TextMessageUtil.readBodyText(TextMessageUtil.java:37)
at org.apache.activemq.artemis.jms.client.ActiveMQTextMessage.doBeforeReceive(ActiveMQTextMessage.java:112)
at org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.getMessage(ActiveMQMessageConsumer.java:228)
... 11 more
我能看到的最有可能的问题是 readableBytes=127646
和 _AMQ_LARGE_SIZE=127651
之间的相似性。
不过从文档来看,这个 _AMQ_LARGE_SIZE 是大消息的阈值,应该是 2GB,这个消息是什么,1.36MB?
怎么回事?
编辑:
[root@6dcbad102045 large-messages]# pwd
/opt/amq/broker/data/large-messages
[root@6dcbad102045 large-messages]# ls -l
total 13828
-rw-r--r-- 1 root root 6451200 Sep 14 2020 194154444.msg
-rw-r--r-- 1 root root 4198400 Nov 5 2020 266358970.msg
-rw-r--r-- 1 root root 1843200 Nov 13 2020 277265384.msg
-rw-r--r-- 1 root root 1433600 Apr 28 12:36 522483226.msg
-rw-r--r-- 1 root root 102400 Jun 2 15:07 578576791.msg
-rw-r--r-- 1 root root 127651 Jun 3 09:46 579961682.msg
我在 Fuse/OSGi。 2.6.3.redhat-00015 对于 ActiveMQ Artemis JMS 客户端 OSGi。 2.21.5 用于骆驼 amqp。我不知道它是什么 Artemis 版本。有 1000 多次成功交付。只有 6 个失败。
2.6.3.redhat-00015
版本对应的是AMQ 7.2.3,此时已经很老了。当前的 AMQ 版本是 7.8.1。我强烈建议您升级,因为您可能遇到了一个已经修复的错误。
您可以通过增加最小大邮件大小(例如,在核心客户端 URL 上使用 minLargeMessageSize
或在你的 AMQP acceptor
)。对于它的价值,堆栈跟踪表明在抛出异常时核心 JMS 客户端(即不是 AMQP)正在使用中。
最后,值得注意的是默认的最小大邮件大小是 100 KB 而不是 2 GB,如 the documentation 中所述。
我正在尝试解决这个 ActiveMQ Artemis 错误。
似乎偶尔的消息对 SimpleString
来说太大了,没有发送,它转到了 DLQ。
java.lang.IndexOutOfBoundsException: Error reading in simpleString, length=1366648 is greater than readableBytes=127646@ClientLargeMessageImpl[messageID=578576793, durable=true, address=AuthCorrespondence.sendmail,userID=7f72137c-c3a3-11eb-87f7-0242c0a8e003,properties=TypedProperties[__AMQ_CID=b3f70eb1-be3c-11eb-87f7-0242c0a8e003,_AMQ_LARGE_SIZE=127651,_AMQ_ROUTING_TYPE=1]]
at org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.getMessage(ActiveMQMessageConsumer.java:234)
at org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.receive(ActiveMQMessageConsumer.java:132)
at org.springframework.jms.support.destination.JmsDestinationAccessor.receiveFromConsumer(JmsDestinationAccessor.java:130)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:416)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:302)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:255)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1168)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1160)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1057)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IndexOutOfBoundsException: Error reading in simpleString, length=1366648 is greater than readableBytes=127646
at org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:183)
at org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:171)
at org.apache.activemq.artemis.api.core.SimpleString.readNullableSimpleString(SimpleString.java:158)
at org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper.readNullableSimpleString(ChannelBufferWrapper.java:69)
at org.apache.activemq.artemis.reader.TextMessageUtil.readBodyText(TextMessageUtil.java:37)
at org.apache.activemq.artemis.jms.client.ActiveMQTextMessage.doBeforeReceive(ActiveMQTextMessage.java:112)
at org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.getMessage(ActiveMQMessageConsumer.java:228)
... 11 more
我能看到的最有可能的问题是 readableBytes=127646
和 _AMQ_LARGE_SIZE=127651
之间的相似性。
不过从文档来看,这个 _AMQ_LARGE_SIZE 是大消息的阈值,应该是 2GB,这个消息是什么,1.36MB?
怎么回事?
编辑:
[root@6dcbad102045 large-messages]# pwd
/opt/amq/broker/data/large-messages
[root@6dcbad102045 large-messages]# ls -l
total 13828
-rw-r--r-- 1 root root 6451200 Sep 14 2020 194154444.msg
-rw-r--r-- 1 root root 4198400 Nov 5 2020 266358970.msg
-rw-r--r-- 1 root root 1843200 Nov 13 2020 277265384.msg
-rw-r--r-- 1 root root 1433600 Apr 28 12:36 522483226.msg
-rw-r--r-- 1 root root 102400 Jun 2 15:07 578576791.msg
-rw-r--r-- 1 root root 127651 Jun 3 09:46 579961682.msg
我在 Fuse/OSGi。 2.6.3.redhat-00015 对于 ActiveMQ Artemis JMS 客户端 OSGi。 2.21.5 用于骆驼 amqp。我不知道它是什么 Artemis 版本。有 1000 多次成功交付。只有 6 个失败。
2.6.3.redhat-00015
版本对应的是AMQ 7.2.3,此时已经很老了。当前的 AMQ 版本是 7.8.1。我强烈建议您升级,因为您可能遇到了一个已经修复的错误。
您可以通过增加最小大邮件大小(例如,在核心客户端 URL 上使用 minLargeMessageSize
或在你的 AMQP acceptor
)。对于它的价值,堆栈跟踪表明在抛出异常时核心 JMS 客户端(即不是 AMQP)正在使用中。
最后,值得注意的是默认的最小大邮件大小是 100 KB 而不是 2 GB,如 the documentation 中所述。