This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 14709dc CAMEL-17420: camel-core - Add flag to turn on|off source loc:line 14709dc is described below commit 14709dcf54bcbf379059ccb077af929d2e518ef1 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Jan 4 16:42:23 2022 +0100 CAMEL-17420: camel-core - Add flag to turn on|off source loc:line --- .../camel/impl/debugger/CamelDebuggerFactory.java | 2 ++ .../main/java/org/apache/camel/CamelContext.java | 18 +++++++++++ .../camel/impl/engine/AbstractCamelContext.java | 11 +++++++ .../camel/impl/ExtendedCamelContextConfigurer.java | 6 ++++ .../camel/impl/lw/LightweightCamelContext.java | 10 ++++++ .../impl/lw/LightweightRuntimeCamelContext.java | 10 ++++++ .../apache/camel/model/ProcessorDefinition.java | 3 +- .../org/apache/camel/model/RouteDefinition.java | 5 ++- ....java => LineNumberProcessorDebuggingTest.java} | 37 ++++++++++------------ .../camel/processor/LineNumberProcessorTest.java | 2 +- ...st.java => LineNumberProcessorTracingTest.java} | 36 ++++++++++----------- .../MainConfigurationPropertiesConfigurer.java | 6 ++++ .../camel-main-configuration-metadata.json | 1 + core/camel-main/src/main/docs/main.adoc | 3 +- .../camel/main/DefaultConfigurationConfigurer.java | 3 ++ .../camel/main/DefaultConfigurationProperties.java | 28 ++++++++++++++++ 16 files changed, 133 insertions(+), 48 deletions(-) diff --git a/components/camel-debug/src/main/java/org/apache/camel/impl/debugger/CamelDebuggerFactory.java b/components/camel-debug/src/main/java/org/apache/camel/impl/debugger/CamelDebuggerFactory.java index 5bd2f54..b2ea55d 100644 --- a/components/camel-debug/src/main/java/org/apache/camel/impl/debugger/CamelDebuggerFactory.java +++ b/components/camel-debug/src/main/java/org/apache/camel/impl/debugger/CamelDebuggerFactory.java @@ -30,6 +30,8 @@ public class CamelDebuggerFactory implements DebuggerFactory { public Debugger createDebugger(CamelContext camelContext) throws Exception { // must enable message history for debugger to capture more details camelContext.setMessageHistory(true); + // must enable source location so debugger tooling knows to map breakpoints to source code + camelContext.setSourceLocationEnabled(true); BacklogDebugger backlog = BacklogDebugger.createDebugger(camelContext); // we need to enable debugger after context is started diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java index 74138f6..749a16a 100644 --- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java +++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java @@ -1187,6 +1187,24 @@ public interface CamelContext extends CamelContextLifecycle, RuntimeConfiguratio void setLoadHealthChecks(Boolean loadHealthChecks); /** + * Whether to capture precise source location:line-number for all EIPs in Camel routes. + * + * Enabling this will impact parsing Java based routes (also Groovy, Kotlin, etc.) on startup as this uses + * {@link StackTraceElement} to calculate the location from the Camel route, which comes with a performance cost. + * This only impact startup, not the performance of the routes at runtime. + */ + Boolean isSourceLocationEnabled(); + + /** + * Whether to capture precise source location:line-number for all EIPs in Camel routes. + * + * Enabling this will impact parsing Java based routes (also Groovy, Kotlin, etc.) on startup as this uses + * {@link StackTraceElement} to calculate the location from the Camel route, which comes with a performance cost. + * This only impact startup, not the performance of the routes at runtime. + */ + void setSourceLocationEnabled(Boolean sourceLocationEnabled); + + /** * Whether or not type converter statistics is enabled. * <p/> * By default the type converter utilization statistics is disabled. <b>Notice:</b> If enabled then there is a diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java index de9eea0..30e7215 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java @@ -261,6 +261,7 @@ public abstract class AbstractCamelContext extends BaseService private Boolean disableJMX = Boolean.FALSE; private Boolean loadTypeConverters = Boolean.FALSE; private Boolean loadHealthChecks = Boolean.FALSE; + private Boolean sourceLocationEnabled = Boolean.FALSE; private Boolean typeConverterStatisticsEnabled = Boolean.FALSE; private Boolean dumpRoutes = Boolean.FALSE; private Boolean useMDCLogging = Boolean.FALSE; @@ -4208,6 +4209,16 @@ public abstract class AbstractCamelContext extends BaseService } @Override + public Boolean isSourceLocationEnabled() { + return sourceLocationEnabled; + } + + @Override + public void setSourceLocationEnabled(Boolean sourceLocationEnabled) { + this.sourceLocationEnabled = sourceLocationEnabled; + } + + @Override public void setTypeConverterStatisticsEnabled(Boolean typeConverterStatisticsEnabled) { this.typeConverterStatisticsEnabled = typeConverterStatisticsEnabled; } diff --git a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java index 54bc4a1..a6e90dd 100644 --- a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java +++ b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java @@ -163,6 +163,8 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com case "ShutdownRunningTask": target.setShutdownRunningTask(property(camelContext, org.apache.camel.ShutdownRunningTask.class, value)); return true; case "shutdownstrategy": case "ShutdownStrategy": target.setShutdownStrategy(property(camelContext, org.apache.camel.spi.ShutdownStrategy.class, value)); return true; + case "sourcelocationenabled": + case "SourceLocationEnabled": target.setSourceLocationEnabled(property(camelContext, java.lang.Boolean.class, value)); return true; case "startupsteprecorder": case "StartupStepRecorder": target.setStartupStepRecorder(property(camelContext, org.apache.camel.spi.StartupStepRecorder.class, value)); return true; case "startupsummarylevel": @@ -346,6 +348,8 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com case "ShutdownRunningTask": return org.apache.camel.ShutdownRunningTask.class; case "shutdownstrategy": case "ShutdownStrategy": return org.apache.camel.spi.ShutdownStrategy.class; + case "sourcelocationenabled": + case "SourceLocationEnabled": return java.lang.Boolean.class; case "startupsteprecorder": case "StartupStepRecorder": return org.apache.camel.spi.StartupStepRecorder.class; case "startupsummarylevel": @@ -530,6 +534,8 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com case "ShutdownRunningTask": return target.getShutdownRunningTask(); case "shutdownstrategy": case "ShutdownStrategy": return target.getShutdownStrategy(); + case "sourcelocationenabled": + case "SourceLocationEnabled": return target.isSourceLocationEnabled(); case "startupsteprecorder": case "StartupStepRecorder": return target.getStartupStepRecorder(); case "startupsummarylevel": diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java index 8fc20d9..7d61d65 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java @@ -900,6 +900,16 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam } @Override + public Boolean isSourceLocationEnabled() { + return delegate.isSourceLocationEnabled(); + } + + @Override + public void setSourceLocationEnabled(Boolean sourceLocationEnabled) { + delegate.setSourceLocationEnabled(sourceLocationEnabled); + } + + @Override public Boolean isDumpRoutes() { return delegate.isDumpRoutes(); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java index 55d7836..04726e4 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java @@ -1193,6 +1193,16 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat } @Override + public Boolean isSourceLocationEnabled() { + throw new UnsupportedOperationException(); + } + + @Override + public void setSourceLocationEnabled(Boolean sourceLocationEnabled) { + throw new UnsupportedOperationException(); + } + + @Override public Boolean isTypeConverterStatisticsEnabled() { throw new UnsupportedOperationException(); } diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java index cfcc6d7..4822689 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinition.java @@ -177,9 +177,8 @@ public abstract class ProcessorDefinition<Type extends ProcessorDefinition<Type> } } } - if (context != null && (context.isDebugging() || context.isTracing())) { + if (context != null && (context.isSourceLocationEnabled() || context.isDebugging() || context.isTracing())) { // we want to capture source location:line for every output - // (this is an expensive operation, so only do this if debugging or tracing is enabled) ProcessorDefinitionHelper.prepareSourceLocation(output); if (log.isDebugEnabled()) { log.debug("{} located in {}:{}", output.getShortName(), output.getLocation(), diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java index 1fabdf4..adfb691 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java @@ -733,10 +733,9 @@ public class RouteDefinition extends OutputDefinition<RouteDefinition> implement // does not have a <from> as it is implied to be the rest endpoint this.input = input; - if (getCamelContext() != null - && (getCamelContext().isDebugging() || getCamelContext().isTracing())) { + if (getCamelContext() != null && (getCamelContext().isSourceLocationEnabled() || getCamelContext().isDebugging() + || getCamelContext().isTracing())) { // we want to capture source location:line for every output - // (this is an expensive operation, so only do this if debugging or tracing is enabled) ProcessorDefinitionHelper.prepareSourceLocation(input); if (log.isDebugEnabled()) { log.debug("{} located in {}:{}", input.getShortName(), input.getLocation(), diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorDebuggingTest.java similarity index 71% copy from core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java copy to core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorDebuggingTest.java index 3713b68..53dc719 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorDebuggingTest.java @@ -17,41 +17,36 @@ package org.apache.camel.processor; import org.apache.camel.CamelContext; -import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.LineNumberAware; import org.apache.camel.Processor; +import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.DefaultCamelContext; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class LineNumberProcessorTest extends ContextTestSupport { - - @Override - protected CamelContext createCamelContext() throws Exception { - CamelContext context = super.createCamelContext(); - context.setTracing(true); // enables line numbering - return context; - } +public class LineNumberProcessorDebuggingTest { @Test public void testLineNumber() throws Exception { - getMockEndpoint("mock:result").expectedBodiesReceived("org.apache.camel.processor.LineNumberProcessorTest$1:51"); - - template.sendBody("direct:start", "Hello World"); - - assertMockEndpointsSatisfied(); - } + CamelContext context = new DefaultCamelContext(); + context.setDebugging(true); - @Override - protected RouteBuilder createRouteBuilder() throws Exception { - return new RouteBuilder() { + context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start") - .process(new MyProcessor()) - .to("mock:result"); + .process(new MyProcessor()); } - }; + }); + + context.start(); + + ProducerTemplate template = context.createProducerTemplate(); + + Object out = template.requestBody("direct:start", "Hello World"); + Assertions.assertEquals("org.apache.camel.processor.LineNumberProcessorDebuggingTest$1:40", out); } private static class MyProcessor implements Processor, LineNumberAware { diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java index 3713b68..268ddc5 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java @@ -29,7 +29,7 @@ public class LineNumberProcessorTest extends ContextTestSupport { @Override protected CamelContext createCamelContext() throws Exception { CamelContext context = super.createCamelContext(); - context.setTracing(true); // enables line numbering + context.setSourceLocationEnabled(true); return context; } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTracingTest.java similarity index 73% copy from core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java copy to core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTracingTest.java index 3713b68..a3422ea 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/LineNumberProcessorTracingTest.java @@ -21,37 +21,33 @@ import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.LineNumberAware; import org.apache.camel.Processor; +import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.DefaultCamelContext; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class LineNumberProcessorTest extends ContextTestSupport { - - @Override - protected CamelContext createCamelContext() throws Exception { - CamelContext context = super.createCamelContext(); - context.setTracing(true); // enables line numbering - return context; - } +public class LineNumberProcessorTracingTest extends ContextTestSupport { @Test public void testLineNumber() throws Exception { - getMockEndpoint("mock:result").expectedBodiesReceived("org.apache.camel.processor.LineNumberProcessorTest$1:51"); - - template.sendBody("direct:start", "Hello World"); - - assertMockEndpointsSatisfied(); - } + CamelContext context = new DefaultCamelContext(); + context.setTracing(true); - @Override - protected RouteBuilder createRouteBuilder() throws Exception { - return new RouteBuilder() { + context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start") - .process(new MyProcessor()) - .to("mock:result"); + .process(new LineNumberProcessorTracingTest.MyProcessor()); } - }; + }); + + context.start(); + + ProducerTemplate template = context.createProducerTemplate(); + + Object out = template.requestBody("direct:start", "Hello World"); + Assertions.assertEquals("org.apache.camel.processor.LineNumberProcessorTracingTest$1:41", out); } private static class MyProcessor implements Processor, LineNumberAware { diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java index 4025964..76e1a7c 100644 --- a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java +++ b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java @@ -179,6 +179,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp case "ShutdownSuppressLoggingOnTimeout": target.setShutdownSuppressLoggingOnTimeout(property(camelContext, boolean.class, value)); return true; case "shutdowntimeout": case "ShutdownTimeout": target.setShutdownTimeout(property(camelContext, int.class, value)); return true; + case "sourcelocationenabled": + case "SourceLocationEnabled": target.setSourceLocationEnabled(property(camelContext, boolean.class, value)); return true; case "startuprecorder": case "StartupRecorder": target.setStartupRecorder(property(camelContext, java.lang.String.class, value)); return true; case "startuprecorderdir": @@ -394,6 +396,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp case "ShutdownSuppressLoggingOnTimeout": return boolean.class; case "shutdowntimeout": case "ShutdownTimeout": return int.class; + case "sourcelocationenabled": + case "SourceLocationEnabled": return boolean.class; case "startuprecorder": case "StartupRecorder": return java.lang.String.class; case "startuprecorderdir": @@ -610,6 +614,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp case "ShutdownSuppressLoggingOnTimeout": return target.isShutdownSuppressLoggingOnTimeout(); case "shutdowntimeout": case "ShutdownTimeout": return target.getShutdownTimeout(); + case "sourcelocationenabled": + case "SourceLocationEnabled": return target.isSourceLocationEnabled(); case "startuprecorder": case "StartupRecorder": return target.getStartupRecorder(); case "startuprecorderdir": diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json index 6cdd85c..668fe14 100644 --- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json +++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json @@ -89,6 +89,7 @@ { "name": "camel.main.shutdownRoutesInReverseOrder", "description": "Sets whether routes should be shutdown in reverse or the same order as they were started.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true }, { "name": "camel.main.shutdownSuppressLoggingOnTimeout", "description": "Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors\/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is defa [...] { "name": "camel.main.shutdownTimeout", "description": "Timeout in seconds to graceful shutdown Camel.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": 45 }, + { "name": "camel.main.sourceLocationEnabled", "description": "Whether to capture precise source location:line-number for all EIPs in Camel routes. Enabling this will impact parsing Java based routes (also Groovy, Kotlin, etc.) on startup as this uses JDK StackTraceElement to calculate the location from the Camel route, which comes with a performance cost. This only impact startup, not the performance of the routes at runtime.", "sourceType": "org.apache.camel.main.DefaultConfiguratio [...] { "name": "camel.main.startupRecorder", "description": "To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false (or off), logging, java-flight-recorder (or jfr).", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "enum": [ "false", "off", "java-flight-recorder", "jfr", "logging" ] }, { "name": "camel.main.startupRecorderDir", "description": "Directory to store the recording. By default the current directory will be used. Use false to turn off saving recording to disk.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" }, { "name": "camel.main.startupRecorderDuration", "description": "How long time to run the startup recorder. Use 0 (default) to keep the recorder running until the JVM is exited. Use -1 to stop the recorder right after Camel has been started (to only focus on potential Camel startup performance bottlenecks) Use a positive value to keep recording for N seconds. When the recorder is stopped then the recording is auto saved to disk (note: save to disk can be disabled by setting startupRec [...] diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc index f9df45a..5d8124f 100644 --- a/core/camel-main/src/main/docs/main.adoc +++ b/core/camel-main/src/main/docs/main.adoc @@ -21,7 +21,7 @@ The following tables lists all the options: // main options: START === Camel Main configurations -The camel.main supports 104 options, which are listed below. +The camel.main supports 105 options, which are listed below. [width="100%",cols="2,5,^1,2",options="header"] |=== @@ -105,6 +105,7 @@ The camel.main supports 104 options, which are listed below. | *camel.main.shutdownRoutesIn{zwsp}ReverseOrder* | Sets whether routes should be shutdown in reverse or the same order as they were started. | true | boolean | *camel.main.shutdownSuppress{zwsp}LoggingOnTimeout* | Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is default false. | false | boolean | *camel.main.shutdownTimeout* | Timeout in seconds to graceful shutdown Camel. | 45 | int +| *camel.main.sourceLocation{zwsp}Enabled* | Whether to capture precise source location:line-number for all EIPs in Camel routes. Enabling this will impact parsing Java based routes (also Groovy, Kotlin, etc.) on startup as this uses JDK StackTraceElement to calculate the location from the Camel route, which comes with a performance cost. This only impact startup, not the performance of the routes at runtime. | false | boolean | *camel.main.startupRecorder* | To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false (or off), logging, java-flight-recorder (or jfr). | | String | *camel.main.startupRecorderDir* | Directory to store the recording. By default the current directory will be used. Use false to turn off saving recording to disk. | | String | *camel.main.startupRecorder{zwsp}Duration* | How long time to run the startup recorder. Use 0 (default) to keep the recorder running until the JVM is exited. Use -1 to stop the recorder right after Camel has been started (to only focus on potential Camel startup performance bottlenecks) Use a positive value to keep recording for N seconds. When the recorder is stopped then the recording is auto saved to disk (note: save to disk can be disabled by setting startupRecorderDir to false) | | long diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java index 2476d46..1933e4c 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java @@ -266,6 +266,9 @@ public final class DefaultConfigurationConfigurer { if (config.isMessageHistory()) { camelContext.setMessageHistory(true); } + if (config.isSourceLocationEnabled()) { + camelContext.setSourceLocationEnabled(true); + } camelContext.setBacklogTracing(config.isBacklogTracing()); camelContext.setTracing(config.isTracing()); diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java index 0b6e0b2..6b13ed7 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java @@ -69,6 +69,7 @@ public abstract class DefaultConfigurationProperties<T> { private boolean tracing; private boolean tracingStandby; private String tracingPattern; + private boolean sourceLocationEnabled; private boolean messageHistory; private boolean logMask; private boolean logExhaustedMessageBody; @@ -588,6 +589,21 @@ public abstract class DefaultConfigurationProperties<T> { this.messageHistory = messageHistory; } + public boolean isSourceLocationEnabled() { + return sourceLocationEnabled; + } + + /** + * Whether to capture precise source location:line-number for all EIPs in Camel routes. + * + * Enabling this will impact parsing Java based routes (also Groovy, Kotlin, etc.) on startup as this uses JDK + * StackTraceElement to calculate the location from the Camel route, which comes with a performance cost. This only + * impact startup, not the performance of the routes at runtime. + */ + public void setSourceLocationEnabled(boolean sourceLocationEnabled) { + this.sourceLocationEnabled = sourceLocationEnabled; + } + public boolean isLogMask() { return logMask; } @@ -1729,6 +1745,18 @@ public abstract class DefaultConfigurationProperties<T> { } /** + * Whether to capture precise source location:line-number for all EIPs in Camel routes. + * + * Enabling this will impact parsing Java based routes (also Groovy, Kotlin, etc.) on startup as this uses JDK + * StackTraceElement to calculate the location from the Camel route, which comes with a performance cost. This only + * impact startup, not the performance of the routes at runtime. + */ + public T withSourceLocationEnabled(boolean sourceLocationEnabled) { + this.sourceLocationEnabled = sourceLocationEnabled; + return (T) this; + } + + /** * Sets whether log mask is enabled or not. * * Default is false.