如何查看org.apache.activemq.command.ActiveMQTextMessage的完整消息文本
2022-12-14 14:04:56,317 DEBUG
[org.apa.cam.com.jms.EndpointMessageListener] (Camel (camel-1) thread
#8 - JmsConsumer[my.queue]) activemq://queue:my.queue consumer received JMS message: ActiveMQTextMessage {commandId = 13,
responseRequired = true, messageId = ID:xxxx, originalDestination =
null,..., content = org.apache.activemq.util.ByteSequence@11ba49fe,
..., text = { "foo": "bar", "x...y": false}}
注意日志中的text字段已被截断,如何查看完整的消息文本?
当前日志输出逻辑
EndpointMessageListener中的日志语句如下:
LOG.debug("{} consumer received JMS message: {}", this.endpoint, message);
截断原因分析
传入日志的message为javax.jms.Message类型,当它是org.apache.activemq.command.ActiveMQTextMessage实例时,其toString()方法会主动截断文本内容:
public String toString() { try { String text = this.text; if (text == null) { text = this.decodeContent(this.getContent()); } if (text != null) { text = MarshallingSupport.truncate64(text); HashMap<String, Object> overrideFields = new HashMap(); overrideFields.put("text", text); return super.toString(overrideFields); } } catch (JMSException var3) { } return super.toString(); }
该方法调用的truncate64方法会将超过63字符的文本截断为「前45位+...+后12位」的格式:
public static String truncate64(String text) { if (text.length() > 63) { String var10000 = text.substring(0, 45); text = var10000 + "..." + text.substring(text.length() - 12); } return text; }
获取完整消息内容的方法
1. 修改日志输出代码
直接调用ActiveMQTextMessage的getText()方法获取完整文本,避免依赖toString()的截断逻辑:
if (message instanceof ActiveMQTextMessage) { ActiveMQTextMessage textMessage = (ActiveMQTextMessage) message; try { LOG.debug("{} consumer received JMS message: {}, full text: {}", this.endpoint, message, textMessage.getText()); } catch (JMSException e) { LOG.error("Failed to get full message text", e); } } else { LOG.debug("{} consumer received JMS message: {}", this.endpoint, message); }
2. 通过ActiveMQ管理工具查看
如果无法修改代码,可通过以下方式查看:
- Web控制台:访问ActiveMQ默认Web端口(通常为8161),进入对应队列页面,直接查看消息的完整内容。
- JMX API:通过JMX连接到ActiveMQ Broker,调用管理API获取队列中消息的详情。
3. 修改源码(不推荐)
若必须全局取消截断,可修改MarshallingSupport.truncate64方法的逻辑(比如移除截断判断),但这需要修改ActiveMQ源码并重新编译,会影响所有依赖该方法的日志输出,风险较高,不建议使用。
内容的提问来源于stack exchange,提问作者WesternGun

