You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tomcat中启用完整消息历史?排查请求转发丢失故障

Tomcat部署第三方应用请求转发丢失故障排查

我正在排查部署在Tomcat上的第三方应用故障——预期会被转发的请求莫名丢失,未按预期完成转发。我已将日志级别设置为FINE,并在tomcat9-stdout.[date].log中看到如下错误信息。想请教:是否可通过修改Tomcat配置启用完整消息历史?这是否是解决该问题的有效方法?


日志信息

localhost_access_log.[date].txt

142.75.24.52 - - [15/May/2024:11:40:07 +1200] "DELETE [url removed] HTTP/1.1" 500 -

tomcat9-stdout.[date].log

2024-05-15 11:40:07:957 +1200 [https-jsse-nio-443-exec-7] ERROR org.apache.camel.processor.errorhandler.DefaultErrorHandler - Failed delivery for (MessageId: ID-[id removed] on ExchangeId: ID-[id removed]). Exhausted after delivery attempt: 1 caught: java.lang.ArrayIndexOutOfBoundsException: 8. Processed by failure processor: FatalFallbackErrorHandler[null]

Message History (complete message history is disabled)
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[route1            ] [route1            ] [from[servlet:/?httpBinding=awgCamelHttpBinding&matchOnUriPrefix=true]         ] [        20]
    ...
[route1            ] [to1               ] [http://0.0.0.0:0000/?bridgeEndpoint=true&throwExceptionOnFailure=true&urlRewri] [         0]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------

java.lang.ArrayIndexOutOfBoundsException: 8

问题解答

1. 是否可通过修改Tomcat配置启用完整消息历史?

日志中提示的Message History (complete message history is disabled)是Apache Camel的特性,不属于Tomcat配置范畴。要启用完整消息历史,需修改Camel的配置:

  • 代码方式配置Camel上下文:
    CamelContext context = new DefaultCamelContext();
    context.setMessageHistory(true);
    context.setStreamCaching(true); // 配合消息历史完整记录流数据
    
  • XML配置方式:
    <camelContext xmlns="http://camel.apache.org/schema/spring" messageHistory="true" streamCaching="true">
        <!-- 路由定义 -->
    </camelContext>
    

2. 这是否是解决该问题的有效方法?

启用完整消息历史是有效的故障排查手段,但不能直接解决问题:

  • 完整消息历史会展示请求在Camel路由中经过的所有处理器细节,能帮你精准定位ArrayIndexOutOfBoundsException发生的具体环节,明确是哪个处理器触发了数组越界错误。
  • 当前日志已抛出java.lang.ArrayIndexOutOfBoundsException: 8,这是请求转发失败的直接原因。启用消息历史后,你能看到错误发生前请求的完整流转路径,辅助定位第三方应用中Camel路由的代码层面问题。

额外排查建议

  • 优先针对ArrayIndexOutOfBoundsException排查:检查Camel路由中涉及数组操作的逻辑,或第三方应用提供的Camel组件是否存在索引越界问题。
  • 临时将Camel相关日志级别调整为DEBUG,获取更详细的路由执行日志,配合消息历史缩小排查范围。

内容的提问来源于stack exchange,提问作者meataxe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:48:16