| [[Message-History]] |
| = Message History |
| |
| Camel supports the |
| https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageHistory.html[Message History] |
| from the xref:enterprise-integration-patterns.adoc[EIP patterns] book. |
| |
| The Message History from the EIP patterns allows for analyzing and debugging the flow of messages in a loosely coupled system. |
| |
| image::eip/MessageHistory.gif[image] |
| |
| Attaching a Message History to the message will provide a list of all applications that the message passed through since its origination. |
| |
| During routing Camel captures how the Exchange is routed, as a `org.apache.camel.MessageHistory` entity |
| that is stored on the Exchange. On the `org.apache.camel.MessageHistory` there is information abut the |
| route id, processor id, timestamp, and elapsed time it took to process the Exchange by the processor. |
| |
| == Enabling or disabling Message History |
| |
| The Message History can be enabled or disabled per CamelContext or per route (enabled by default). |
| For example you can turn it off with |
| |
| [source,java] |
| ---- |
| camelContext.setMessageHistory(false); |
| ---- |
| |
| Or in XML |
| |
| [source,xml] |
| ---- |
| <camelContext messageHistory="false"> |
| |
| </camelContext> |
| ---- |
| |
| You can also do this per route. Then a route level configuration overrides the CamelContext level configuration. |
| |
| == Route stack-trace in exceptions logged by error handler |
| |
| If Message History is enabled, then Camel will leverage this information, |
| when the Error Handler logs exhausted exceptions. Then in addition to the caused exception with its stacktrace, |
| you can see the message history; you may think this as a "route stacktrace". |
| |
| And example is provided below: |
| |
| [source,text] |
| ---- |
| 2013-05-31 14:41:28,084 [ - seda://start] ERROR DefaultErrorHandler - Failed delivery for (MessageId: ID-davsclaus-air-lan-55446-1370004087263-0-1 on ExchangeId: ID-davsclaus-air-lan-55446-1370004087263-0-3). Exhausted after delivery attempt: 1 caught: java.lang.IllegalArgumentException: Forced to dump message history |
| |
| Message History |
| --------------------------------------------------------------------------------------------------------------------------------------- |
| RouteId ProcessorId Processor Elapsed (ms) |
| [route1 ] [to1 ] [log:foo ] [ 6] |
| [route1 ] [to2 ] [direct:bar ] [ 102] |
| [route2 ] [to5 ] [log:bar ] [ 1] |
| [route2 ] [delay2 ] [delay[{100}] ] [ 100] |
| [route2 ] [to6 ] [mock:bar ] [ 0] |
| [route1 ] [delay1 ] [delay[{300}] ] [ 303] |
| [route1 ] [to3 ] [log:baz ] [ 0] |
| [route1 ] [process1 ] [org.apache.camel.processor.MessageHistoryDumpRoutingTest$1$1@6a53f9d8 ] [ 2] |
| |
| Stacktrace |
| --------------------------------------------------------------------------------------------------------------------------------------- |
| java.lang.IllegalArgumentException: Forced to dump message history |
| at org.apache.camel.processor.MessageHistoryDumpRoutingTest$1$1.process(MessageHistoryDumpRoutingTest.java:54) |
| at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63) |
| at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:388) |
| at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:189) |
| at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) |
| at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) |
| at org.apache.camel.processor.DelayProcessorSupport.process(DelayProcessorSupport.java:117) |
| at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:388) |
| at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:189) |
| at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) |
| at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) |
| at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:189) |
| at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:293) |
| at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:202) |
| at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:149) |
| at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) |
| at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) |
| at java.lang.Thread.run(Thread.java:722) |
| ---- |
| |
| You can turn off logging message history from the Error Handler using |
| |
| [source,java] |
| ---- |
| errorHandler(defaultErrorHandler().logExhaustedMessageHistory(false)); |
| ---- |
| |
| From Camel 2.17 onwards the Error Handler do not log the message body/header details anymore (to avoid logging sensitive message body details). |
| You can turn on the old behavior. |
| |
| [source,java] |
| ---- |
| errorHandler(defaultErrorHandler().logExhaustedMessageBody(true)); |
| ---- |