You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/05/14 04:29:32 UTC

[camel] 01/07: CAMEL-13503: Camel main - Allow to configure global and common options ala camel-spring-boot have.

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 109685e53a1ed4f967873e217b056aeba3963f3e
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon May 13 08:24:23 2019 +0200

    CAMEL-13503: Camel main - Allow to configure global and common options ala camel-spring-boot have.
---
 .../camel/main/MainConfigurationProperties.java    | 798 +++++++++++++++++++++
 .../java/org/apache/camel/main/MainSupport.java    |   8 +-
 .../src/main/resources/application.properties      |   2 +-
 3 files changed, 805 insertions(+), 3 deletions(-)

diff --git a/core/camel-core/src/main/java/org/apache/camel/main/MainConfigurationProperties.java b/core/camel-core/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
new file mode 100644
index 0000000..a3ae86d
--- /dev/null
+++ b/core/camel-core/src/main/java/org/apache/camel/main/MainConfigurationProperties.java
@@ -0,0 +1,798 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.main;
+
+import org.apache.camel.ManagementStatisticsLevel;
+
+/**
+ * Global configuration for Camel Main to setup context name, stream caching and other global configurations.
+ */
+public class MainConfigurationProperties {
+
+    // TODO: Move javadoc to setter
+
+    /**
+     * Sets the name of the CamelContext.
+     */
+    private String name;
+
+    /**
+     * Timeout in seconds to graceful shutdown Camel.
+     */
+    private int shutdownTimeout = 300;
+
+    /**
+     * 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.
+     */
+    private boolean shutdownSuppressLoggingOnTimeout;
+
+    /**
+     * Sets whether to force shutdown of all consumers when a timeout occurred and thus
+     * not all consumers was shutdown within that period.
+     *
+     * You should have good reasons to set this option to false as it means that the routes
+     * keep running and is halted abruptly when CamelContext has been shutdown.
+     */
+    private boolean shutdownNowOnTimeout = true;
+
+    /**
+     * Sets whether routes should be shutdown in reverse or the same order as they where started.
+     */
+    private boolean shutdownRoutesInReverseOrder = true;
+
+    /**
+     * Sets whether to log information about the inflight Exchanges which are still running
+     * during a shutdown which didn't complete without the given timeout.
+     */
+    private boolean shutdownLogInflightExchangesOnTimeout = true;
+
+    /**
+     * Enable JMX in your Camel application.
+     */
+    private boolean jmxEnabled = true;
+
+    /**
+     * Producer template endpoints cache size.
+     */
+    private int producerTemplateCacheSize = 1000;
+
+    /**
+     * Consumer template endpoints cache size.
+     */
+    private int consumerTemplateCacheSize = 1000;
+
+    /**
+     * Directory to load additional configuration files that contains
+     * configuration values that takes precedence over any other configuration.
+     * This can be used to refer to files that may have secret configuration that
+     * has been mounted on the file system for containers.
+     *
+     * You must use either file: or classpath: as prefix to load
+     * from file system or classpath. Then you can specify a pattern to load
+     * from sub directories and a name pattern such as file:/var/app/secret/*.properties
+     */
+    private String fileConfigurations;
+
+    /**
+     * To specify for how long time in seconds to keep running the JVM before automatic terminating the JVM.
+     * You can use this to run Spring Boot for a short while.
+     */
+    private int durationMaxSeconds;
+
+    /**
+     * To specify for how long time in seconds Camel can be idle before automatic terminating the JVM.
+     * You can use this to run Spring Boot for a short while.
+     */
+    private int durationMaxIdleSeconds;
+
+    /**
+     * To specify how many messages to process by Camel before automatic terminating the JVM.
+     * You can use this to run Spring Boot for a short while.
+     */
+    private int durationMaxMessages;
+
+    /**
+     * Is used to limit the maximum length of the logging Camel message bodies. If the message body
+     * is longer than the limit, the log message is clipped. Use -1 to have unlimited length.
+     * Use for example 1000 to log at most 1000 characters.
+     */
+    private int logDebugMaxChars;
+
+    /**
+     * Sets whether stream caching is enabled or not.
+     *
+     * Default is false.
+     */
+    private boolean streamCachingEnabled;
+
+    /**
+     * Sets the stream caching spool (temporary) directory to use for overflow and spooling to disk.
+     *
+     * If no spool directory has been explicit configured, then a temporary directory
+     * is created in the java.io.tmpdir directory.
+     */
+    private String streamCachingSpoolDirectory;
+
+    /**
+     * Sets a stream caching chiper name to use when spooling to disk to write with encryption.
+     * By default the data is not encrypted.
+     */
+    private String streamCachingSpoolChiper;
+
+    /**
+     * Stream caching threshold in bytes when overflow to disk is activated.
+     * The default threshold is 128kb.
+     * Use -1 to disable overflow to disk.
+     */
+    private long streamCachingSpoolThreshold;
+
+    /**
+     * Sets a percentage (1-99) of used heap memory threshold to activate stream caching spooling to disk.
+     */
+    private int streamCachingSpoolUsedHeapMemoryThreshold;
+
+    /**
+     * Sets what the upper bounds should be when streamCachingSpoolUsedHeapMemoryThreshold is in use.
+     */
+    private String streamCachingSpoolUsedHeapMemoryLimit;
+
+    /**
+     * Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules
+     * returns true then shouldSpoolCache(long) returns true, to allow spooling to disk.
+     * If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must
+     * return true.
+     *
+     * The default value is false which means that all the rules must return true.
+     */
+    private boolean streamCachingAnySpoolRules;
+
+    /**
+     * Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches.
+     *
+     * The default size is 4096.
+     */
+    private int streamCachingBufferSize;
+
+    /**
+     * Whether to remove stream caching temporary directory when stopping.
+     * This option is default true.
+     */
+    private boolean streamCachingRemoveSpoolDirectoryWhenStopping = true;
+
+    /**
+     * Sets whether stream caching statistics is enabled.
+     */
+    private boolean streamCachingStatisticsEnabled;
+
+    /**
+     * Sets whether tracing is enabled or not.
+     *
+     * Default is false.
+     */
+    private boolean tracing;
+
+    /**
+     * Sets whether message history is enabled or not.
+     *
+     * Default is true.
+     */
+    private boolean messageHistory = true;
+
+    /**
+     * Sets whether log mask is enabled or not.
+     *
+     * Default is false.
+     */
+    private boolean logMask;
+
+    /**
+     * Sets whether to log exhausted message body with message history.
+     *
+     * Default is false.
+     */
+    private boolean logExhaustedMessageBody;
+
+    /**
+     * Sets whether fault handling is enabled or not.
+     *
+     * Default is false.
+     */
+    private boolean handleFault;
+
+    /**
+     * Sets whether the object should automatically start when Camel starts.
+     * Important: Currently only routes can be disabled, as CamelContext's are always started.
+     * Note: When setting auto startup false on CamelContext then that takes precedence
+     * and no routes is started. You would need to start CamelContext explicit using
+     * the org.apache.camel.CamelContext.start() method, to start the context, and then
+     * you would need to start the routes manually using CamelContext.getRouteController().startRoute(String).
+     *
+     * Default is true to always start up.
+     */
+    private boolean autoStartup = true;
+
+    /**
+     * Sets whether to allow access to the original message from Camel's error handler,
+     * or from org.apache.camel.spi.UnitOfWork.getOriginalInMessage().
+     * Turning this off can optimize performance, as defensive copy of the original message is not needed.
+     *
+     * Default is false.
+     */
+    private boolean allowUseOriginalMessage;
+
+    /**
+     * Sets whether endpoint runtime statistics is enabled (gathers runtime usage of each incoming and outgoing endpoints).
+     *
+     * The default value is false.
+     */
+    private boolean endpointRuntimeStatisticsEnabled;
+
+    /**
+     * Whether to enable using data type on Camel messages.
+     *
+     * Data type are automatic turned on if one ore more routes has been explicit configured with input and output types.
+     * Otherwise data type is default off.
+     */
+    private boolean useDataType;
+
+    /**
+     * Set whether breadcrumb is enabled.
+     * The default value is false.
+     */
+    private boolean useBreadcrumb;
+
+    /**
+     * Sets the JMX statistics level
+     * The level can be set to Extended to gather additional information
+     *
+     * The default value is Default.
+     */
+    private ManagementStatisticsLevel jmxManagementStatisticsLevel = ManagementStatisticsLevel.Default;
+
+    /**
+     * The naming pattern for creating the CamelContext JMX management name.
+     *
+     * The default pattern is #name#
+     */
+    private String jmxManagementNamePattern = "#name#";
+
+    /**
+     * Whether JMX connector is created, allowing clients to connect remotely
+     *
+     * The default value is false.
+     */
+    private boolean jmxCreateConnector;
+
+    /**
+     * Tracer should output message body
+     */
+    private boolean traceFormatterShowBody = true;
+
+    /**
+     * Tracer should output message body type
+     */
+    private boolean tracerFormatterShowBodyType = true;
+
+    /**
+     * Tracer should output breadcrumb
+     */
+    private boolean traceFormatterShowBreadCrumb = true;
+
+    /**
+     * Tracer should output exchange id
+     */
+    private boolean traceFormatterShowExchangeId;
+
+    /**
+     * Tracer should output message headers
+     */
+    private boolean traceFormatterShowHeaders = true;
+
+    /**
+     * Tracer should output exchange properties
+     */
+    private boolean traceFormatterShowProperties;
+
+    /**
+     * Tracer should output EIP node
+     */
+    private boolean traceFormatterShowNode = true;
+
+    /**
+     * Tracer should output message exchange pattern (MEP)
+     */
+    private boolean traceFormatterShowExchangePattern = true;
+
+    /**
+     * Tracer should output exception
+     */
+    private boolean traceFormatterShowException = true;
+
+    /**
+     * Tracer should output route id
+     */
+    private boolean traceFormatterShowRouteId = true;
+
+    /**
+     * Tracer maximum length of breadcrumb ids
+     */
+    private Integer tracerFormatterBreadCrumbLength;
+
+    /**
+     * Tracer should output short exchange id
+     */
+    private boolean traceFormatterShowShortExchangeId;
+
+    /**
+     * Tracer maximum length of node
+     */
+    private Integer tracerFormatterNodeLength;
+
+    /**
+     * Tracer maximum characters in total
+     */
+    private Integer tracerFormatterMaxChars = 10000;
+
+    /**
+     * To turn on MDC logging
+     */
+    private boolean useMdcLogging;
+
+    /**
+     * Sets the thread name pattern used for creating the full thread name.
+     *
+     * The default pattern is: Camel (#camelId#) thread ##counter# - #name#
+     *
+     * Where #camelId# is the name of the CamelContext.
+     * and #counter# is a unique incrementing counter.
+     * and #name# is the regular thread name.
+     *
+     * You can also use #longName# which is the long thread name which can includes endpoint parameters etc.
+     */
+    private String threadNamePattern;
+
+    // getter and setters
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getShutdownTimeout() {
+        return shutdownTimeout;
+    }
+
+    public void setShutdownTimeout(int shutdownTimeout) {
+        this.shutdownTimeout = shutdownTimeout;
+    }
+
+    public boolean isShutdownSuppressLoggingOnTimeout() {
+        return shutdownSuppressLoggingOnTimeout;
+    }
+
+    public void setShutdownSuppressLoggingOnTimeout(boolean shutdownSuppressLoggingOnTimeout) {
+        this.shutdownSuppressLoggingOnTimeout = shutdownSuppressLoggingOnTimeout;
+    }
+
+    public boolean isShutdownNowOnTimeout() {
+        return shutdownNowOnTimeout;
+    }
+
+    public void setShutdownNowOnTimeout(boolean shutdownNowOnTimeout) {
+        this.shutdownNowOnTimeout = shutdownNowOnTimeout;
+    }
+
+    public boolean isShutdownRoutesInReverseOrder() {
+        return shutdownRoutesInReverseOrder;
+    }
+
+    public void setShutdownRoutesInReverseOrder(boolean shutdownRoutesInReverseOrder) {
+        this.shutdownRoutesInReverseOrder = shutdownRoutesInReverseOrder;
+    }
+
+    public boolean isShutdownLogInflightExchangesOnTimeout() {
+        return shutdownLogInflightExchangesOnTimeout;
+    }
+
+    public void setShutdownLogInflightExchangesOnTimeout(boolean shutdownLogInflightExchangesOnTimeout) {
+        this.shutdownLogInflightExchangesOnTimeout = shutdownLogInflightExchangesOnTimeout;
+    }
+
+    public boolean isJmxEnabled() {
+        return jmxEnabled;
+    }
+
+    public void setJmxEnabled(boolean jmxEnabled) {
+        this.jmxEnabled = jmxEnabled;
+    }
+
+    public int getProducerTemplateCacheSize() {
+        return producerTemplateCacheSize;
+    }
+
+    public void setProducerTemplateCacheSize(int producerTemplateCacheSize) {
+        this.producerTemplateCacheSize = producerTemplateCacheSize;
+    }
+
+    public int getConsumerTemplateCacheSize() {
+        return consumerTemplateCacheSize;
+    }
+
+    public void setConsumerTemplateCacheSize(int consumerTemplateCacheSize) {
+        this.consumerTemplateCacheSize = consumerTemplateCacheSize;
+    }
+
+    public String getFileConfigurations() {
+        return fileConfigurations;
+    }
+
+    public void setFileConfigurations(String fileConfigurations) {
+        this.fileConfigurations = fileConfigurations;
+    }
+
+    public int getDurationMaxSeconds() {
+        return durationMaxSeconds;
+    }
+
+    public void setDurationMaxSeconds(int durationMaxSeconds) {
+        this.durationMaxSeconds = durationMaxSeconds;
+    }
+
+    public int getDurationMaxIdleSeconds() {
+        return durationMaxIdleSeconds;
+    }
+
+    public void setDurationMaxIdleSeconds(int durationMaxIdleSeconds) {
+        this.durationMaxIdleSeconds = durationMaxIdleSeconds;
+    }
+
+    public int getDurationMaxMessages() {
+        return durationMaxMessages;
+    }
+
+    public void setDurationMaxMessages(int durationMaxMessages) {
+        this.durationMaxMessages = durationMaxMessages;
+    }
+
+    public int getLogDebugMaxChars() {
+        return logDebugMaxChars;
+    }
+
+    public void setLogDebugMaxChars(int logDebugMaxChars) {
+        this.logDebugMaxChars = logDebugMaxChars;
+    }
+
+    public boolean isStreamCachingEnabled() {
+        return streamCachingEnabled;
+    }
+
+    public void setStreamCachingEnabled(boolean streamCachingEnabled) {
+        this.streamCachingEnabled = streamCachingEnabled;
+    }
+
+    public String getStreamCachingSpoolDirectory() {
+        return streamCachingSpoolDirectory;
+    }
+
+    public void setStreamCachingSpoolDirectory(String streamCachingSpoolDirectory) {
+        this.streamCachingSpoolDirectory = streamCachingSpoolDirectory;
+    }
+
+    public String getStreamCachingSpoolChiper() {
+        return streamCachingSpoolChiper;
+    }
+
+    public void setStreamCachingSpoolChiper(String streamCachingSpoolChiper) {
+        this.streamCachingSpoolChiper = streamCachingSpoolChiper;
+    }
+
+    public long getStreamCachingSpoolThreshold() {
+        return streamCachingSpoolThreshold;
+    }
+
+    public void setStreamCachingSpoolThreshold(long streamCachingSpoolThreshold) {
+        this.streamCachingSpoolThreshold = streamCachingSpoolThreshold;
+    }
+
+    public int getStreamCachingSpoolUsedHeapMemoryThreshold() {
+        return streamCachingSpoolUsedHeapMemoryThreshold;
+    }
+
+    public void setStreamCachingSpoolUsedHeapMemoryThreshold(int streamCachingSpoolUsedHeapMemoryThreshold) {
+        this.streamCachingSpoolUsedHeapMemoryThreshold = streamCachingSpoolUsedHeapMemoryThreshold;
+    }
+
+    public String getStreamCachingSpoolUsedHeapMemoryLimit() {
+        return streamCachingSpoolUsedHeapMemoryLimit;
+    }
+
+    public void setStreamCachingSpoolUsedHeapMemoryLimit(String streamCachingSpoolUsedHeapMemoryLimit) {
+        this.streamCachingSpoolUsedHeapMemoryLimit = streamCachingSpoolUsedHeapMemoryLimit;
+    }
+
+    public boolean isStreamCachingAnySpoolRules() {
+        return streamCachingAnySpoolRules;
+    }
+
+    public void setStreamCachingAnySpoolRules(boolean streamCachingAnySpoolRules) {
+        this.streamCachingAnySpoolRules = streamCachingAnySpoolRules;
+    }
+
+    public int getStreamCachingBufferSize() {
+        return streamCachingBufferSize;
+    }
+
+    public void setStreamCachingBufferSize(int streamCachingBufferSize) {
+        this.streamCachingBufferSize = streamCachingBufferSize;
+    }
+
+    public boolean isStreamCachingRemoveSpoolDirectoryWhenStopping() {
+        return streamCachingRemoveSpoolDirectoryWhenStopping;
+    }
+
+    public void setStreamCachingRemoveSpoolDirectoryWhenStopping(boolean streamCachingRemoveSpoolDirectoryWhenStopping) {
+        this.streamCachingRemoveSpoolDirectoryWhenStopping = streamCachingRemoveSpoolDirectoryWhenStopping;
+    }
+
+    public boolean isStreamCachingStatisticsEnabled() {
+        return streamCachingStatisticsEnabled;
+    }
+
+    public void setStreamCachingStatisticsEnabled(boolean streamCachingStatisticsEnabled) {
+        this.streamCachingStatisticsEnabled = streamCachingStatisticsEnabled;
+    }
+
+    public boolean isTracing() {
+        return tracing;
+    }
+
+    public void setTracing(boolean tracing) {
+        this.tracing = tracing;
+    }
+
+    public boolean isMessageHistory() {
+        return messageHistory;
+    }
+
+    public void setMessageHistory(boolean messageHistory) {
+        this.messageHistory = messageHistory;
+    }
+
+    public boolean isLogMask() {
+        return logMask;
+    }
+
+    public void setLogMask(boolean logMask) {
+        this.logMask = logMask;
+    }
+
+    public boolean isLogExhaustedMessageBody() {
+        return logExhaustedMessageBody;
+    }
+
+    public void setLogExhaustedMessageBody(boolean logExhaustedMessageBody) {
+        this.logExhaustedMessageBody = logExhaustedMessageBody;
+    }
+
+    public boolean isHandleFault() {
+        return handleFault;
+    }
+
+    public void setHandleFault(boolean handleFault) {
+        this.handleFault = handleFault;
+    }
+
+    public boolean isAutoStartup() {
+        return autoStartup;
+    }
+
+    public void setAutoStartup(boolean autoStartup) {
+        this.autoStartup = autoStartup;
+    }
+
+    public boolean isAllowUseOriginalMessage() {
+        return allowUseOriginalMessage;
+    }
+
+    public void setAllowUseOriginalMessage(boolean allowUseOriginalMessage) {
+        this.allowUseOriginalMessage = allowUseOriginalMessage;
+    }
+
+    public boolean isEndpointRuntimeStatisticsEnabled() {
+        return endpointRuntimeStatisticsEnabled;
+    }
+
+    public void setEndpointRuntimeStatisticsEnabled(boolean endpointRuntimeStatisticsEnabled) {
+        this.endpointRuntimeStatisticsEnabled = endpointRuntimeStatisticsEnabled;
+    }
+
+    public boolean isUseDataType() {
+        return useDataType;
+    }
+
+    public void setUseDataType(boolean useDataType) {
+        this.useDataType = useDataType;
+    }
+
+    public boolean isUseBreadcrumb() {
+        return useBreadcrumb;
+    }
+
+    public void setUseBreadcrumb(boolean useBreadcrumb) {
+        this.useBreadcrumb = useBreadcrumb;
+    }
+
+    public ManagementStatisticsLevel getJmxManagementStatisticsLevel() {
+        return jmxManagementStatisticsLevel;
+    }
+
+    public void setJmxManagementStatisticsLevel(ManagementStatisticsLevel jmxManagementStatisticsLevel) {
+        this.jmxManagementStatisticsLevel = jmxManagementStatisticsLevel;
+    }
+
+    public String getJmxManagementNamePattern() {
+        return jmxManagementNamePattern;
+    }
+
+    public void setJmxManagementNamePattern(String jmxManagementNamePattern) {
+        this.jmxManagementNamePattern = jmxManagementNamePattern;
+    }
+
+    public boolean isJmxCreateConnector() {
+        return jmxCreateConnector;
+    }
+
+    public void setJmxCreateConnector(boolean jmxCreateConnector) {
+        this.jmxCreateConnector = jmxCreateConnector;
+    }
+
+    public boolean isTraceFormatterShowBody() {
+        return traceFormatterShowBody;
+    }
+
+    public void setTraceFormatterShowBody(boolean traceFormatterShowBody) {
+        this.traceFormatterShowBody = traceFormatterShowBody;
+    }
+
+    public boolean isTracerFormatterShowBodyType() {
+        return tracerFormatterShowBodyType;
+    }
+
+    public void setTracerFormatterShowBodyType(boolean tracerFormatterShowBodyType) {
+        this.tracerFormatterShowBodyType = tracerFormatterShowBodyType;
+    }
+
+    public boolean isTraceFormatterShowBreadCrumb() {
+        return traceFormatterShowBreadCrumb;
+    }
+
+    public void setTraceFormatterShowBreadCrumb(boolean traceFormatterShowBreadCrumb) {
+        this.traceFormatterShowBreadCrumb = traceFormatterShowBreadCrumb;
+    }
+
+    public boolean isTraceFormatterShowExchangeId() {
+        return traceFormatterShowExchangeId;
+    }
+
+    public void setTraceFormatterShowExchangeId(boolean traceFormatterShowExchangeId) {
+        this.traceFormatterShowExchangeId = traceFormatterShowExchangeId;
+    }
+
+    public boolean isTraceFormatterShowHeaders() {
+        return traceFormatterShowHeaders;
+    }
+
+    public void setTraceFormatterShowHeaders(boolean traceFormatterShowHeaders) {
+        this.traceFormatterShowHeaders = traceFormatterShowHeaders;
+    }
+
+    public boolean isTraceFormatterShowProperties() {
+        return traceFormatterShowProperties;
+    }
+
+    public void setTraceFormatterShowProperties(boolean traceFormatterShowProperties) {
+        this.traceFormatterShowProperties = traceFormatterShowProperties;
+    }
+
+    public boolean isTraceFormatterShowNode() {
+        return traceFormatterShowNode;
+    }
+
+    public void setTraceFormatterShowNode(boolean traceFormatterShowNode) {
+        this.traceFormatterShowNode = traceFormatterShowNode;
+    }
+
+    public boolean isTraceFormatterShowExchangePattern() {
+        return traceFormatterShowExchangePattern;
+    }
+
+    public void setTraceFormatterShowExchangePattern(boolean traceFormatterShowExchangePattern) {
+        this.traceFormatterShowExchangePattern = traceFormatterShowExchangePattern;
+    }
+
+    public boolean isTraceFormatterShowException() {
+        return traceFormatterShowException;
+    }
+
+    public void setTraceFormatterShowException(boolean traceFormatterShowException) {
+        this.traceFormatterShowException = traceFormatterShowException;
+    }
+
+    public boolean isTraceFormatterShowRouteId() {
+        return traceFormatterShowRouteId;
+    }
+
+    public void setTraceFormatterShowRouteId(boolean traceFormatterShowRouteId) {
+        this.traceFormatterShowRouteId = traceFormatterShowRouteId;
+    }
+
+    public Integer getTracerFormatterBreadCrumbLength() {
+        return tracerFormatterBreadCrumbLength;
+    }
+
+    public void setTracerFormatterBreadCrumbLength(Integer tracerFormatterBreadCrumbLength) {
+        this.tracerFormatterBreadCrumbLength = tracerFormatterBreadCrumbLength;
+    }
+
+    public boolean isTraceFormatterShowShortExchangeId() {
+        return traceFormatterShowShortExchangeId;
+    }
+
+    public void setTraceFormatterShowShortExchangeId(boolean traceFormatterShowShortExchangeId) {
+        this.traceFormatterShowShortExchangeId = traceFormatterShowShortExchangeId;
+    }
+
+    public Integer getTracerFormatterNodeLength() {
+        return tracerFormatterNodeLength;
+    }
+
+    public void setTracerFormatterNodeLength(Integer tracerFormatterNodeLength) {
+        this.tracerFormatterNodeLength = tracerFormatterNodeLength;
+    }
+
+    public Integer getTracerFormatterMaxChars() {
+        return tracerFormatterMaxChars;
+    }
+
+    public void setTracerFormatterMaxChars(Integer tracerFormatterMaxChars) {
+        this.tracerFormatterMaxChars = tracerFormatterMaxChars;
+    }
+
+    public boolean isUseMdcLogging() {
+        return useMdcLogging;
+    }
+
+    public void setUseMdcLogging(boolean useMdcLogging) {
+        this.useMdcLogging = useMdcLogging;
+    }
+
+    public String getThreadNamePattern() {
+        return threadNamePattern;
+    }
+
+    public void setThreadNamePattern(String threadNamePattern) {
+        this.threadNamePattern = threadNamePattern;
+    }
+}
diff --git a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
index c01451b..b974f36 100644
--- a/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/core/camel-core/src/main/java/org/apache/camel/main/MainSupport.java
@@ -73,19 +73,23 @@ public abstract class MainSupport extends ServiceSupport {
     protected final CountDownLatch latch = new CountDownLatch(1);
     protected final AtomicBoolean completed = new AtomicBoolean(false);
     protected final AtomicInteger exitCode = new AtomicInteger(UNINITIALIZED_EXIT_CODE);
+
+    // TODO: Move these to mainConfigurationProperties (delegate)
     protected long duration = -1;
     protected long durationIdle = -1;
     protected int durationMaxMessages;
     protected TimeUnit timeUnit = TimeUnit.SECONDS;
     protected boolean trace;
+    protected String fileWatchDirectory;
+    protected boolean fileWatchDirectoryRecursively;
 
     protected CamelContext camelContext;
+    // TODO: Make it possible to configure MainConfigurationProperties from application.properties via camel.main.xxx
+    protected final MainConfigurationProperties mainConfigurationProperties = new MainConfigurationProperties();
     protected List<RouteBuilder> routeBuilders = new ArrayList<>();
     protected String routeBuilderClasses;
     protected List<Object> configurations = new ArrayList<>();
     protected String configurationClasses;
-    protected String fileWatchDirectory;
-    protected boolean fileWatchDirectoryRecursively;
     protected ProducerTemplate camelTemplate;
     protected boolean hangupInterceptorEnabled = true;
     protected int durationHitExitCode = DEFAULT_EXIT_CODE;
diff --git a/examples/camel-example-main/src/main/resources/application.properties b/examples/camel-example-main/src/main/resources/application.properties
index 1c47fff..859f3cb 100644
--- a/examples/camel-example-main/src/main/resources/application.properties
+++ b/examples/camel-example-main/src/main/resources/application.properties
@@ -20,7 +20,7 @@
 camel.component.quartz2.start-delayed-seconds = 3
 
 # you can configure whether OS environment should override (=2 which is default) or as fallback (=1)
-### camel.component.properties.environment-variable-mode=1
+camel.component.properties.environment-variable-mode=1
 
 # properties used in the route
 myCron = 0/2 * * * * ?