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/06/18 08:42:15 UTC

[camel] branch master updated: Polish camel-soroush to not use Endpoint as enum and also polished its label on its options.

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


The following commit(s) were added to refs/heads/master by this push:
     new a268537  Polish camel-soroush to not use Endpoint as enum and also polished its label on its options.
a268537 is described below

commit a2685379954de1a833332af60ed25376496c58b8
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jun 18 10:41:53 2019 +0200

    Polish camel-soroush to not use Endpoint as enum and also polished its label on its options.
---
 .../src/main/docs/soroush-component.adoc           |   34 +-
 .../component/SoroushBotAbstractConsumer.java      |   11 +-
 .../component/SoroushBotDownloadFileProducer.java  |    4 +-
 .../soroushbot/component/SoroushBotEndpoint.java   |  202 ++--
 .../component/SoroushBotMultiThreadConsumer.java   |    4 +-
 .../component/SoroushBotSendMessageProducer.java   |   12 +-
 .../component/SoroushBotUploadFileProducer.java    |    4 +-
 .../models/{Endpoint.java => SoroushAction.java}   |    4 +-
 .../soroushbot/service/SoroushService.java         |   10 +-
 .../component/ConsumerAutoDownloadFile.java        |    4 +-
 .../ConsumerAutoReconnectAfterIdleTimeoutTest.java |    4 +-
 .../component/ConsumerCamelConcurrentTest.java     |    4 +-
 .../ConsumerExceptionHandledWithErrorHandler.java  |    4 +-
 .../soroushbot/component/ConsumerMultiThread.java  |    4 +-
 .../component/ConsumerNativeConcurrentTest.java    |    4 +-
 .../component/ConsumerQueueCapacityPerThread.java  |    4 +-
 .../ConsumerRetryOnConnectionFailure.java          |    4 +-
 .../soroushbot/component/ConsumerTest.java         |    4 +-
 ...onentialBackOffProducerConnectionRetryTest.java |    4 +-
 .../FixedBackOffProducerConnectionRetryTest.java   |    4 +-
 .../component/HandleExceptionWithErrorHandler.java |    6 +-
 .../LinearBackOffProducerConnectionRetryTest.java  |    4 +-
 ...etryWaitingTimeProducerConnectionRetryTest.java |    4 +-
 .../component/ProducerAutoUploadFile.java          |    4 +-
 .../component/ProducerAutoUploadFileIsFalse.java   |    4 +-
 .../component/ProducerConnectionRetryTest.java     |    4 +-
 .../soroushbot/component/ProducerDownloadFile.java |    6 +-
 .../ProducerDownloadFileWithoutThumbnail.java      |    6 +-
 .../ProducerMaxConnectionRetryReachedTest.java     |    4 +-
 .../soroushbot/component/ProducerTest.java         |    4 +-
 .../soroushbot/component/ProducerUploadFile.java   |    4 +-
 .../soroushbot/service/SoroushServiceTest.java     |    6 +-
 .../dsl/SoroushBotEndpointBuilderFactory.java      | 1051 ++++++++------------
 33 files changed, 587 insertions(+), 849 deletions(-)

diff --git a/components/camel-soroush/src/main/docs/soroush-component.adoc b/components/camel-soroush/src/main/docs/soroush-component.adoc
index 59293a8..c93310b 100644
--- a/components/camel-soroush/src/main/docs/soroush-component.adoc
+++ b/components/camel-soroush/src/main/docs/soroush-component.adoc
@@ -67,7 +67,7 @@ The Soroush component supports 3 options, which are listed below.
 The Soroush endpoint is configured using URI syntax:
 
 ----
-soroush:endpoint/authorizationToken
+soroush:action/authorizationToken
 ----
 
 with the following path and query parameters:
@@ -78,7 +78,7 @@ with the following path and query parameters:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
-| *endpoint* | *Required* The endpoint type. Support getMessage as consumer and sendMessage,uploadFile,downloadFile as producer |  | Endpoint
+| *action* | *Required* The action to do. |  | SoroushAction
 |===
 
 
@@ -88,28 +88,28 @@ with the following path and query parameters:
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
 | Name | Description | Default | Type
+| *connectionTimeout* (common) | Connection timeout in ms when connecting to soroush API | 30000 | int
+| *maxConnectionRetry* (common) | Maximum connection retry when fail to connect to soroush API, if the quota is reached, MaximumConnectionRetryReachedException is thrown for that message. | 4 | int
 | *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
-| *concurrentConsumers* (consumer) | Number of Thread created by consumer in the route. if you use this method for parallelism, it is guaranteed that messages from same user always execute in the same thread and therefore messages from the same user are processed sequentially. Default value notice: using SoroushBotSingleThreadConsumer | 1 | Integer
-| *queueCapacityPerThread* (consumer) | Maximum capacity of each queue when concurrentConsumers is greater than 1. if a queue become full, every message that should go to that queue will be dropped. If bridgeErrorHandler is set to true, an exchange with CongestionException is directed to ErrorHandler. You can then processed the error using onException(CongestionException.class) route. Default value notice: infinite capacity | 0 | Integer
+| *concurrentConsumers* (consumer) | Number of Thread created by consumer in the route. if you use this method for parallelism, it is guaranteed that messages from same user always execute in the same thread and therefore messages from the same user are processed sequentially. Default value notice: using SoroushBotSingleThreadConsumer | 1 | int
+| *queueCapacityPerThread* (consumer) | Maximum capacity of each queue when concurrentConsumers is greater than 1. if a queue become full, every message that should go to that queue will be dropped. If bridgeErrorHandler is set to true, an exchange with CongestionException is directed to ErrorHandler. You can then processed the error using onException(CongestionException.class) route. Default value notice: infinite capacity | 0 | int
 | *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
 | *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
+| *autoDownload* (producer) | Automatically download SoroushMessage.fileUrl and SoroushMessage.thumbnailUrl if exists for the message and store them in SoroushMessage.file and SoroushMessage.thumbnail field | false | boolean
+| *autoUploadFile* (producer) | Automatically upload attachments when a message goes to the sendMessage endpoint and the SoroushMessage.file (SoroushMessage.thumbnail) has been set and SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null | true | boolean
+| *downloadThumbnail* (producer) | If true, when downloading an attached file, thumbnail will be downloaded if provided in the message. Otherwise, only the file will be downloaded | true | boolean
+| *forceDownload* (producer) | Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail) was not null in that message | false | boolean
+| *forceUpload* (producer) | Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if exists, even if the SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in the message | false | boolean
 | *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
 | *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
 | *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
-| *autoDownload* (getMessage) | Automatically download SoroushMessage.fileUrl and SoroushMessage.thumbnailUrl if exists for the message and store them in SoroushMessage.file and SoroushMessage.thumbnail field | false | Boolean
-| *reconnectIdleConnection Timeout* (getMessage) | The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed. | 300000 | long
-| *downloadThumbnail* (downloadFile) | If true, when downloading an attached file, thumbnail will be downloaded if provided in the message. Otherwise, only the file will be downloaded | true | Boolean
-| *forceDownload* (downloadFile) | Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail) was not null in that message | false | Boolean
-| *backOffStrategy* (global) | The strategy to backoff in case of connection failure. Currently 3 strategies are supported: 1. Exponential (default): It multiply retryWaitingTime by retryExponentialCoefficient after each connection failure. 2. Linear: It increase retryWaitingTime by retryLinearIncrement after each connection failure. 3. Fixed: Always use retryWaitingTime as the time between retries. | Exponential | String
-| *connectionTimeout* (global) | Connection timeout in ms when connecting to soroush API | 30000 | Integer
-| *maxConnectionRetry* (global) | Maximum connection retry when fail to connect to soroush API, if the quota is reached, MaximumConnectionRetryReachedException is thrown for that message. | 4 | Integer
-| *maxRetryWaitingTime* (global) | Maximum amount of time (in millisecond) a thread wait before retrying failed request. | 3600000 | Long
-| *retryExponentialCoefficient* (global) | Coefficient to compute back off time when using Exponential Back Off strategy | 2 | Long
-| *retryLinearIncrement* (global) | The amount of time (in millisecond) which adds to waiting time when using Linear back off strategy | 10000 | Long
-| *retryWaitingTime* (global) | Waiting time before retry failed request (Millisecond). If backOffStrategy is not Fixed this is the based value for computing back off waiting time. the first retry is always happen immediately after failure and retryWaitingTime do not apply to the first retry. | 1000 | Long
 | *authorizationToken* (security) | The authorization token for using the bot. if uri path does not contain authorization token, this token will be used. |  | String
-| *autoUploadFile* (sendMessage) | Automatically upload attachments when a message goes to the sendMessage endpoint and the SoroushMessage.file (SoroushMessage.thumbnail) has been set and SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null | true | Boolean
-| *forceUpload* (uploadFile) | Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if exists, even if the SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in the message | false | Boolean
+| *backOffStrategy* (scheduling) | The strategy to backoff in case of connection failure. Currently 3 strategies are supported: 1. Exponential (default): It multiply retryWaitingTime by retryExponentialCoefficient after each connection failure. 2. Linear: It increase retryWaitingTime by retryLinearIncrement after each connection failure. 3. Fixed: Always use retryWaitingTime as the time between retries. | Exponential | String
+| *maxRetryWaitingTime* (scheduling) | Maximum amount of time (in millisecond) a thread wait before retrying failed request. | 3600000 | long
+| *reconnectIdleConnection Timeout* (scheduling) | The timeout in millisecond to reconnect the existing getMessage connection to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed. | 300000 | long
+| *retryExponentialCoefficient* (scheduling) | Coefficient to compute back off time when using Exponential Back Off strategy | 2 | long
+| *retryLinearIncrement* (scheduling) | The amount of time (in millisecond) which adds to waiting time when using Linear back off strategy | 10000 | long
+| *retryWaitingTime* (scheduling) | Waiting time before retry failed request (Millisecond). If backOffStrategy is not Fixed this is the based value for computing back off waiting time. the first retry is always happen immediately after failure and retryWaitingTime do not apply to the first retry. | 1000 | long
 |===
 // endpoint options: END
 
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotAbstractConsumer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotAbstractConsumer.java
index e207336..b1215d6 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotAbstractConsumer.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotAbstractConsumer.java
@@ -28,7 +28,7 @@ import okhttp3.sse.EventSourceListener;
 import okhttp3.sse.EventSources;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.service.SoroushService;
 import org.apache.camel.support.DefaultConsumer;
@@ -78,14 +78,14 @@ public abstract class SoroushBotAbstractConsumer extends DefaultConsumer impleme
     private void run() {
         lastMessageReceived = System.currentTimeMillis();
         Request request = new Request.Builder()
-                .url(SoroushService.get().generateUrl(endpoint.authorizationToken, Endpoint.getMessage, null))
+                .url(SoroushService.get().generateUrl(endpoint.getAuthorizationToken(), SoroushAction.getMessage, null))
                 .build();
         OkHttpClient client = new OkHttpClient.Builder()
-                .connectTimeout(endpoint.connectionTimeout, TimeUnit.MILLISECONDS)
+                .connectTimeout(endpoint.getConnectionTimeout(), TimeUnit.MILLISECONDS)
                 .writeTimeout(0L, TimeUnit.MILLISECONDS)
                 .readTimeout(0L, TimeUnit.MILLISECONDS)
                 .build();
-        connection = new ReconnectableEventSourceListener(client, request, endpoint.maxConnectionRetry) {
+        connection = new ReconnectableEventSourceListener(client, request, endpoint.getMaxConnectionRetry()) {
             @Override
             protected boolean onBeforeConnect() {
                 int connectionRetry = getConnectionRetry();
@@ -146,7 +146,7 @@ public abstract class SoroushBotAbstractConsumer extends DefaultConsumer impleme
                             log.debug("event data is: " + data);
                         }
                         // if autoDownload is true, download the resource if provided in the message
-                        if (endpoint.autoDownload) {
+                        if (endpoint.isAutoDownload()) {
                             endpoint.handleDownloadFiles(soroushMessage);
                         }
                         //let each subclass decide how to start processing of each exchange
@@ -190,6 +190,7 @@ class ReconnectableEventSourceListener extends EventSourceListener {
     private Request request;
     private final EventSource.Factory factory;
     private EventSource eventSource;
+
     public ReconnectableEventSourceListener(OkHttpClient client, Request request, int maxConnectionRetry) {
         this.client = client;
         this.maxConnectionRetry = maxConnectionRetry;
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotDownloadFileProducer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotDownloadFileProducer.java
index cc28fe7..9ad87db 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotDownloadFileProducer.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotDownloadFileProducer.java
@@ -17,14 +17,14 @@
 package org.apache.camel.component.soroushbot.component;
 
 import org.apache.camel.Exchange;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.support.DefaultProducer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * this producer is responsible for uri of type {@link Endpoint#downloadFile}
+ * this producer is responsible for uri of type {@link SoroushAction#downloadFile}
  * e.g. "soroush:downloadFile/[token]"
  * if you pass a message to this endpoint, it tries to download the resource
  * ({@link SoroushMessage#fileUrl} and {@link SoroushMessage#thumbnailUrl})
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpoint.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpoint.java
index 95b9f67..14e6d07 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpoint.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotEndpoint.java
@@ -31,7 +31,7 @@ import javax.ws.rs.core.Response;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.models.response.UploadFileResponse;
 import org.apache.camel.component.soroushbot.service.SoroushService;
@@ -55,69 +55,69 @@ import org.slf4j.LoggerFactory;
 /**
  * To integrate with the Soroush chat bot.
  */
-@UriEndpoint(firstVersion = "3.0", scheme = "soroush", title = "Soroush", syntax = "soroush:endpoint/authorizationToken", label = "chat")
+@UriEndpoint(firstVersion = "3.0", scheme = "soroush", title = "Soroush", syntax = "soroush:action/authorizationToken", label = "chat")
 public class SoroushBotEndpoint extends DefaultEndpoint {
 
     private static final Logger LOG = LoggerFactory.getLogger(SoroushBotEndpoint.class);
 
-    @UriPath(name = "endpoint", description = "The endpoint type. Support `getMessage` as consumer and `sendMessage`,`uploadFile`,`downloadFile` as producer")
+    @UriPath(name = "action", description = "The action to do.")
     @Metadata(required = true)
-    Endpoint type;
-    @UriParam(label = "global,security", description = "The authorization token for using"
+    private SoroushAction action;
+    @UriParam(label = "common,security", description = "The authorization token for using"
             + " the bot. if uri path does not contain authorization token, this token will be used.", secret = true)
-    String authorizationToken;
-    @UriParam(label = "global", description = "Connection timeout in ms when connecting to soroush API", defaultValue = "30000")
-    Integer connectionTimeout = 30000;
-    @UriParam(label = "global", description = "Maximum connection retry when fail to connect to soroush API, if the quota is reached,"
+    private String authorizationToken;
+    @UriParam(label = "common", description = "Connection timeout in ms when connecting to soroush API", defaultValue = "30000")
+    private int connectionTimeout = 30000;
+    @UriParam(label = "common", description = "Maximum connection retry when fail to connect to soroush API, if the quota is reached,"
             + " `MaximumConnectionRetryReachedException` is thrown for that message.", defaultValue = "4")
-    Integer maxConnectionRetry = 4;
-    @UriParam(label = "getMessage,consumer", description = "Number of Thread created by consumer in the route."
+    private int maxConnectionRetry = 4;
+    @UriParam(label = "consumer", description = "Number of Thread created by consumer in the route."
             + " if you use this method for parallelism, it is guaranteed that messages from same user always execute in the same"
             + " thread and therefore messages from the same user are processed sequentially", defaultValue = "1",
             defaultValueNote = "using SoroushBotSingleThreadConsumer")
-    Integer concurrentConsumers = 1;
-    @UriParam(label = "getMessage,consumer", description = "Maximum capacity of each queue when `concurrentConsumers` is greater than 1."
+    private int concurrentConsumers = 1;
+    @UriParam(label = "consumer", description = "Maximum capacity of each queue when `concurrentConsumers` is greater than 1."
             + " if a queue become full, every message that should go to that queue will be dropped. If `bridgeErrorHandler`"
             + " is set to `true`, an exchange with `CongestionException` is directed to ErrorHandler. You can then processed the"
             + " error using `onException(CongestionException.class)` route", defaultValue = "0", defaultValueNote = "infinite capacity")
-    Integer queueCapacityPerThread = 0;
-    @UriParam(label = "sendMessage", description = "Automatically upload attachments when a message goes to the sendMessage endpoint "
+    private int queueCapacityPerThread;
+    @UriParam(label = "producer", description = "Automatically upload attachments when a message goes to the sendMessage endpoint "
             + "and the `SoroushMessage.file` (`SoroushMessage.thumbnail`) has been set and `SoroushMessage.fileUrl`(`SoroushMessage.thumbnailUrl`) is null",
             defaultValue = "true")
-    Boolean autoUploadFile = true;
-    @UriParam(label = "sendMessage,uploadFile", description = "Force to  upload `SoroushMessage.file`(`SoroushMessage.thumbnail`) if exists, even if the "
+    private boolean autoUploadFile = true;
+    @UriParam(label = "producer", description = "Force to  upload `SoroushMessage.file`(`SoroushMessage.thumbnail`) if exists, even if the "
             + "`SoroushMessage.fileUrl`(`SoroushMessage.thumbnailUrl`) is not null in the message", defaultValue = "false")
-    Boolean forceUpload = false;
-    @UriParam(label = "getMessage,downloadFile", description = "If true, when downloading an attached file, thumbnail will be downloaded if provided in the message."
+    private boolean forceUpload;
+    @UriParam(label = "producer", description = "If true, when downloading an attached file, thumbnail will be downloaded if provided in the message."
             + " Otherwise, only the file will be downloaded ", defaultValue = "true")
-    Boolean downloadThumbnail = true;
-    @UriParam(label = "downloadFile", description = "Force to download `SoroushMessage.fileUrl`(`SoroushMessage.thumbnailUrl`)"
+    private boolean downloadThumbnail = true;
+    @UriParam(label = "producer", description = "Force to download `SoroushMessage.fileUrl`(`SoroushMessage.thumbnailUrl`)"
             + " if exists, even if the `SoroushMessage.file`(`SoroushMessage.thumbnail`) was not null in that message",
             defaultValue = "false")
-    Boolean forceDownload = false;
-    @UriParam(label = "getMessage", description = "Automatically download `SoroushMessage.fileUrl` and `SoroushMessage.thumbnailUrl` "
+    private boolean forceDownload;
+    @UriParam(label = "producer", description = "Automatically download `SoroushMessage.fileUrl` and `SoroushMessage.thumbnailUrl` "
             + "if exists for the message and store them in `SoroushMessage.file` and `SoroushMessage.thumbnail` field ",
             defaultValue = "false")
-    Boolean autoDownload = false;
-    @UriParam(label = "global", description = "Waiting time before retry failed request (Millisecond)."
+    private boolean autoDownload;
+    @UriParam(label = "scheduling", description = "Waiting time before retry failed request (Millisecond)."
             + " If backOffStrategy is not Fixed this is the based value for computing back off waiting time."
             + " the first retry is always happen immediately after failure and retryWaitingTime do not apply to the first retry.",
             defaultValue = "1000")
-    Long retryWaitingTime = 1000L;
-    @UriParam(label = "global", description = "The strategy to backoff in case of connection failure. Currently 3 strategies are supported:"
+    private long retryWaitingTime = 1000L;
+    @UriParam(label = "scheduling", description = "The strategy to backoff in case of connection failure. Currently 3 strategies are supported:"
             + " 1. `Exponential` (default): It multiply `retryWaitingTime` by `retryExponentialCoefficient` after each connection failure."
             + " 2. `Linear`: It increase `retryWaitingTime` by `retryLinearIncrement` after each connection failure."
             + " 3. `Fixed`: Always use `retryWaitingTime` as the time between retries.",
             defaultValue = "Exponential")
-    String backOffStrategy = "Exponential";
-    @UriParam(label = "global", description = "Coefficient to compute back off time when using `Exponential` Back Off strategy", defaultValue = "2")
-    Long retryExponentialCoefficient = 2L;
-    @UriParam(label = "global", description = "The amount of time (in millisecond) which adds to waiting time when using `Linear` back off strategy", defaultValue = "10000")
-    Long retryLinearIncrement = 10000L;
-    @UriParam(label = "global", description = "Maximum amount of time (in millisecond) a thread wait before retrying failed request.",
+    private String backOffStrategy = "Exponential";
+    @UriParam(label = "scheduling", description = "Coefficient to compute back off time when using `Exponential` Back Off strategy", defaultValue = "2")
+    private long retryExponentialCoefficient = 2L;
+    @UriParam(label = "scheduling", description = "The amount of time (in millisecond) which adds to waiting time when using `Linear` back off strategy", defaultValue = "10000")
+    private long retryLinearIncrement = 10000L;
+    @UriParam(label = "scheduling", description = "Maximum amount of time (in millisecond) a thread wait before retrying failed request.",
             defaultValue = "3600000")
-    Long maxRetryWaitingTime = 3600000L;
-    @UriParam(label = "getMessage", description = "The timeout in millisecond to reconnect the existing getMessage connection"
+    private long maxRetryWaitingTime = 3600000L;
+    @UriParam(label = "scheduling", description = "The timeout in millisecond to reconnect the existing getMessage connection"
             + " to ensure that the connection is always live and does not dead without notifying the bot. this value should not be changed.",
             defaultValue = "300000")
     private long reconnectIdleConnectionTimeout = 5 * 60 * 1000;
@@ -139,14 +139,14 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
      * @return supported Soroush endpoint as string to display in error.
      */
     private String getSupportedEndpointAsString() {
-        return "[" + String.join(", ", getSupportedEndpoint().stream().map(Endpoint::value).collect(Collectors.toList())) + "]";
+        return "[" + String.join(", ", getSupportedEndpoint().stream().map(SoroushAction::value).collect(Collectors.toList())) + "]";
     }
 
     /**
      * @return supported Soroush endpoint by this component which is all Soroush Bot API
      */
-    private List<Endpoint> getSupportedEndpoint() {
-        return Arrays.asList(Endpoint.values());
+    private List<SoroushAction> getSupportedEndpoint() {
+        return Arrays.asList(SoroushAction.values());
     }
 
     /**
@@ -171,12 +171,12 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
         if (pathParts.size() > 2 || pathParts.size() == 0) {
             throw new IllegalArgumentException("Unexpected URI format. Expected soroush://" + getSupportedEndpointAsString() + "[/<authorizationToken>][?options]', found " + uri);
         }
-        for (Endpoint supported : getSupportedEndpoint()) {
+        for (SoroushAction supported : getSupportedEndpoint()) {
             if (supported.value().equals(pathParts.get(0))) {
-                type = supported;
+                action = supported;
             }
         }
-        if (type == null) {
+        if (action == null) {
             throw new IllegalArgumentException("Unexpected URI format. Expected soroush://" + getSupportedEndpointAsString() + "[/<authorizationToken>][?options]', found " + uri);
         }
         if (this.authorizationToken == null) {
@@ -195,12 +195,6 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
      * check and fix invalid value in uri parameter.
      */
     void normalizeConfiguration() {
-        if (connectionTimeout == null) {
-            connectionTimeout = 0;
-        }
-        if (maxConnectionRetry == null) {
-            maxConnectionRetry = 0;
-        }
         if (reconnectIdleConnectionTimeout <= 0) {
             reconnectIdleConnectionTimeout = 5 * 60 * 1000;
         }
@@ -219,22 +213,22 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
     }
 
     /**
-     * create producer based on uri {@link Endpoint}
+     * create producer based on uri {@link SoroushAction}
      *
      * @return created producer
      */
     @Override
     public Producer createProducer() {
-        if (type == Endpoint.sendMessage) {
+        if (action == SoroushAction.sendMessage) {
             return new SoroushBotSendMessageProducer(this);
         }
-        if (type == Endpoint.uploadFile) {
+        if (action == SoroushAction.uploadFile) {
             return new SoroushBotUploadFileProducer(this);
         }
-        if (type == Endpoint.downloadFile) {
+        if (action == SoroushAction.downloadFile) {
             return new SoroushBotDownloadFileProducer(this);
         } else {
-            throw new IllegalArgumentException("only [" + Endpoint.sendMessage + ", " + Endpoint.downloadFile + ", " + Endpoint.uploadFile
+            throw new IllegalArgumentException("only [" + SoroushAction.sendMessage + ", " + SoroushAction.downloadFile + ", " + SoroushAction.uploadFile
                     + "] supported for producer(from) and process");
         }
     }
@@ -255,8 +249,8 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
     @Override
     public Consumer createConsumer(Processor processor) throws Exception {
         Consumer consumer;
-        if (type != Endpoint.getMessage) {
-            throw new IllegalArgumentException("only " + Endpoint.getMessage + " support for consumer(from)");
+        if (action != SoroushAction.getMessage) {
+            throw new IllegalArgumentException("only " + SoroushAction.getMessage + " support for consumer(from)");
         }
         if (concurrentConsumers < 2) {
             consumer = new SoroushBotSingleThreadConsumer(this, processor);
@@ -314,12 +308,12 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
         return sendMessageTarget;
     }
 
-    public Endpoint getType() {
-        return type;
+    public SoroushAction getAction() {
+        return action;
     }
 
-    public void setType(Endpoint type) {
-        this.type = type;
+    public void setAction(SoroushAction action) {
+        this.action = action;
     }
 
     public String getAuthorizationToken() {
@@ -330,67 +324,83 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
         this.authorizationToken = authorizationToken;
     }
 
-    public Integer getConnectionTimeout() {
+    public int getConnectionTimeout() {
         return connectionTimeout;
     }
 
-    public void setConnectionTimeout(Integer connectionTimeout) {
+    public void setConnectionTimeout(int connectionTimeout) {
         this.connectionTimeout = connectionTimeout;
     }
 
-    public Integer getMaxConnectionRetry() {
+    public int getMaxConnectionRetry() {
         return maxConnectionRetry;
     }
 
-    public void setMaxConnectionRetry(Integer maxConnectionRetry) {
+    public void setMaxConnectionRetry(int maxConnectionRetry) {
         this.maxConnectionRetry = maxConnectionRetry;
     }
 
-    public Integer getConcurrentConsumers() {
+    public int getConcurrentConsumers() {
         return concurrentConsumers;
     }
 
-    public void setConcurrentConsumers(Integer concurrentConsumers) {
+    public void setConcurrentConsumers(int concurrentConsumers) {
         this.concurrentConsumers = concurrentConsumers;
     }
 
-    public Integer getQueueCapacityPerThread() {
+    public int getQueueCapacityPerThread() {
         return queueCapacityPerThread;
     }
 
-    public void setQueueCapacityPerThread(Integer queueCapacityPerThread) {
+    public void setQueueCapacityPerThread(int queueCapacityPerThread) {
         this.queueCapacityPerThread = queueCapacityPerThread;
     }
 
-    public Boolean getAutoUploadFile() {
+    public boolean isAutoUploadFile() {
         return autoUploadFile;
     }
 
-    public void setAutoUploadFile(Boolean autoUploadFile) {
+    public void setAutoUploadFile(boolean autoUploadFile) {
         this.autoUploadFile = autoUploadFile;
     }
 
-    public Boolean getForceUpload() {
+    public boolean isForceUpload() {
         return forceUpload;
     }
 
-    public void setForceUpload(Boolean forceUpload) {
+    public void setForceUpload(boolean forceUpload) {
         this.forceUpload = forceUpload;
     }
 
-    public Boolean getDownloadThumbnail() {
+    public boolean isDownloadThumbnail() {
         return downloadThumbnail;
     }
 
-    public void setDownloadThumbnail(Boolean downloadThumbnail) {
+    public void setDownloadThumbnail(boolean downloadThumbnail) {
         this.downloadThumbnail = downloadThumbnail;
     }
 
-    public Long getRetryWaitingTime() {
+    public boolean isForceDownload() {
+        return forceDownload;
+    }
+
+    public void setForceDownload(boolean forceDownload) {
+        this.forceDownload = forceDownload;
+    }
+
+    public boolean isAutoDownload() {
+        return autoDownload;
+    }
+
+    public void setAutoDownload(boolean autoDownload) {
+        this.autoDownload = autoDownload;
+    }
+
+    public long getRetryWaitingTime() {
         return retryWaitingTime;
     }
 
-    public void setRetryWaitingTime(Long retryWaitingTime) {
+    public void setRetryWaitingTime(long retryWaitingTime) {
         this.retryWaitingTime = retryWaitingTime;
     }
 
@@ -402,52 +412,52 @@ public class SoroushBotEndpoint extends DefaultEndpoint {
         this.backOffStrategy = backOffStrategy;
     }
 
-    public Long getRetryExponentialCoefficient() {
+    public long getRetryExponentialCoefficient() {
         return retryExponentialCoefficient;
     }
 
-    public Long getReconnectIdleConnectionTimeout() {
-        return reconnectIdleConnectionTimeout;
-    }
-
-    public void setReconnectIdleConnectionTimeout(Long reconnectIdleConnectionTimeout) {
-        this.reconnectIdleConnectionTimeout = reconnectIdleConnectionTimeout;
-    }
-
-    public void setRetryExponentialCoefficient(Long retryExponentialCoefficient) {
+    public void setRetryExponentialCoefficient(long retryExponentialCoefficient) {
         this.retryExponentialCoefficient = retryExponentialCoefficient;
     }
 
-    public Long getRetryLinearIncrement() {
+    public long getRetryLinearIncrement() {
         return retryLinearIncrement;
     }
 
-    public void setRetryLinearIncrement(Long retryLinearIncrement) {
+    public void setRetryLinearIncrement(long retryLinearIncrement) {
         this.retryLinearIncrement = retryLinearIncrement;
     }
 
-    public Long getMaxRetryWaitingTime() {
+    public long getMaxRetryWaitingTime() {
         return maxRetryWaitingTime;
     }
 
-    public void setMaxRetryWaitingTime(Long maxRetryWaitingTime) {
+    public void setMaxRetryWaitingTime(long maxRetryWaitingTime) {
         this.maxRetryWaitingTime = maxRetryWaitingTime;
     }
 
-    public Boolean getForceDownload() {
-        return forceDownload;
+    public long getReconnectIdleConnectionTimeout() {
+        return reconnectIdleConnectionTimeout;
     }
 
-    public void setForceDownload(Boolean forceDownload) {
-        this.forceDownload = forceDownload;
+    public void setReconnectIdleConnectionTimeout(long reconnectIdleConnectionTimeout) {
+        this.reconnectIdleConnectionTimeout = reconnectIdleConnectionTimeout;
     }
 
-    public Boolean getAutoDownload() {
-        return autoDownload;
+    public void setUploadFileTarget(WebTarget uploadFileTarget) {
+        this.uploadFileTarget = uploadFileTarget;
     }
 
-    public void setAutoDownload(Boolean autoDownload) {
-        this.autoDownload = autoDownload;
+    public void setSendMessageTarget(WebTarget sendMessageTarget) {
+        this.sendMessageTarget = sendMessageTarget;
+    }
+
+    public BackOffStrategy getBackOffStrategyHelper() {
+        return backOffStrategyHelper;
+    }
+
+    public void setBackOffStrategyHelper(BackOffStrategy backOffStrategyHelper) {
+        this.backOffStrategyHelper = backOffStrategyHelper;
     }
 
     /**
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotMultiThreadConsumer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotMultiThreadConsumer.java
index bc10555..0320458 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotMultiThreadConsumer.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotMultiThreadConsumer.java
@@ -25,7 +25,7 @@ import org.apache.camel.component.soroushbot.utils.MultiQueueWithTopicThreadPool
 /**
  * create a thread pool and process each message using one of threads,
  * it is guaranteed that all message from a same person will processed by the same thread.
- * thread pool size could be configured using {@link SoroushBotEndpoint#concurrentConsumers}
+ * thread pool size could be configured using {@link SoroushBotEndpoint#getConcurrentConsumers()}
  * this consumer support both Sync and Async processors.
  */
 public class SoroushBotMultiThreadConsumer extends SoroushBotAbstractConsumer {
@@ -40,7 +40,7 @@ public class SoroushBotMultiThreadConsumer extends SoroushBotAbstractConsumer {
 
     public SoroushBotMultiThreadConsumer(SoroushBotEndpoint endpoint, Processor processor) {
         super(endpoint, processor);
-        threadPool = new MultiQueueWithTopicThreadPool(endpoint.concurrentConsumers, endpoint.queueCapacityPerThread, "Soroush Thread");
+        threadPool = new MultiQueueWithTopicThreadPool(endpoint.getConcurrentConsumers(), endpoint.getQueueCapacityPerThread(), "Soroush Thread");
     }
 
     @Override
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSendMessageProducer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSendMessageProducer.java
index fa425ff..6a1e5be 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSendMessageProducer.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotSendMessageProducer.java
@@ -25,7 +25,7 @@ import javax.ws.rs.core.Response;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.camel.Exchange;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.service.SoroushService;
 import org.apache.camel.component.soroushbot.utils.MaximumConnectionRetryReachedException;
@@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory;
 import static org.apache.camel.component.soroushbot.utils.StringUtils.ordinal;
 
 /**
- * this Producer is responsible for URIs of type {@link Endpoint#sendMessage}
+ * this Producer is responsible for URIs of type {@link SoroushAction#sendMessage}
  * to send message to SoroushAPI.
  * it will be instantiated for URIs like "soroush:sendMessage/[token]
  */
@@ -56,20 +56,20 @@ public class SoroushBotSendMessageProducer extends DefaultProducer {
     public void process(Exchange exchange) throws Exception {
         SoroushMessage message = exchange.getIn().getBody(SoroushMessage.class);
         // if autoUploadFile is true try to upload files inside the message
-        if (endpoint.autoUploadFile) {
+        if (endpoint.isAutoDownload()) {
             endpoint.handleFileUpload(message);
         }
         sendMessage(message);
     }
 
     /**
-     * @throws MaximumConnectionRetryReachedException if can not connect to soroush after retry {@link SoroushBotEndpoint#maxConnectionRetry} times
+     * @throws MaximumConnectionRetryReachedException if can not connect to soroush after retry {@link SoroushBotEndpoint#getMaxConnectionRetry()} times
      * @throws SoroushException                       if soroush response code wasn't 200
      */
     private void sendMessage(SoroushMessage message) throws SoroushException, MaximumConnectionRetryReachedException, InterruptedException {
         Response response;
         // this for is responsible to handle maximum connection retry.
-        for (int count = 0; count <= endpoint.maxConnectionRetry; count++) {
+        for (int count = 0; count <= endpoint.getMaxConnectionRetry(); count++) {
             endpoint.waitBeforeRetry(count);
             try {
                 if (log.isDebugEnabled()) {
@@ -80,7 +80,7 @@ public class SoroushBotSendMessageProducer extends DefaultProducer {
                 SoroushService.get().assertSuccessful(response, message);
                 return;
             } catch (IOException | ProcessingException ex) {
-                if (count == endpoint.maxConnectionRetry) {
+                if (count == endpoint.getMaxConnectionRetry()) {
                     throw new MaximumConnectionRetryReachedException("failed to send message. maximum retry limit reached. aborting... message: " + message, ex, message);
                 }
                 if (log.isWarnEnabled()) {
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotUploadFileProducer.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotUploadFileProducer.java
index 67a48f5..5c75186 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotUploadFileProducer.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/component/SoroushBotUploadFileProducer.java
@@ -17,12 +17,12 @@
 package org.apache.camel.component.soroushbot.component;
 
 import org.apache.camel.Exchange;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.support.DefaultProducer;
 
 /**
- * this Producer is responsible for URIs of type {@link Endpoint#uploadFile}
+ * this Producer is responsible for URIs of type {@link SoroushAction#uploadFile}
  * to upload messages file(thumbnail) to SoroushAPI.
  * it will be instantiated for URIs like "soroush:uploadFile/[token]
  */
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/Endpoint.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushAction.java
similarity index 94%
rename from components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/Endpoint.java
rename to components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushAction.java
index 2437e3d..ae9405a 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/Endpoint.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/models/SoroushAction.java
@@ -16,7 +16,7 @@
  */
 package org.apache.camel.component.soroushbot.models;
 
-public enum Endpoint {
+public enum SoroushAction {
     sendMessage("sendMessage"),
     getMessage("getMessage"),
     uploadFile("uploadFile"),
@@ -24,7 +24,7 @@ public enum Endpoint {
 
     private final String value;
 
-    Endpoint(String value) {
+    SoroushAction(String value) {
         this.value = value;
     }
 
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/service/SoroushService.java b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/service/SoroushService.java
index 6bdab50..4d1ac14 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/service/SoroushService.java
+++ b/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/service/SoroushService.java
@@ -22,7 +22,7 @@ import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
 
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.models.response.SoroushResponse;
 import org.apache.camel.component.soroushbot.utils.SoroushException;
@@ -68,7 +68,7 @@ public final class SoroushService {
      * @param fileId
      * @return
      */
-    public String generateUrl(String token, Endpoint type, String fileId) {
+    public String generateUrl(String token, SoroushAction type, String fileId) {
         return getCurrentUrl() + "/" + token + "/" + type.value() + (fileId != null ? "/" + fileId : "");
     }
 
@@ -90,7 +90,7 @@ public final class SoroushService {
         return ClientBuilder.newBuilder()
                 .property(ClientProperties.CONNECT_TIMEOUT, timeOut)
                 .register(MultiPartFeature.class).build()
-                .target(generateUrl(token, Endpoint.uploadFile, null));
+                .target(generateUrl(token, SoroushAction.uploadFile, null));
     }
 
     /**
@@ -104,7 +104,7 @@ public final class SoroushService {
     public WebTarget createSendMessageTarget(String token, Integer timeOut) {
         return ClientBuilder.newBuilder()
                 .property(ClientProperties.CONNECT_TIMEOUT, timeOut).build()
-                .target(generateUrl(token, Endpoint.sendMessage, null));
+                .target(generateUrl(token, SoroushAction.sendMessage, null));
     }
 
     /**
@@ -119,7 +119,7 @@ public final class SoroushService {
     public WebTarget createDownloadFileTarget(String token, String fileId, Integer timeOut) {
         return ClientBuilder.newBuilder()
                 .property(ClientProperties.CONNECT_TIMEOUT, timeOut).build()
-                .target(generateUrl(token, Endpoint.downloadFile, fileId));
+                .target(generateUrl(token, SoroushAction.downloadFile, fileId));
     }
 
     /**
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoDownloadFile.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoDownloadFile.java
index 02d5849..c6f1b0e 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoDownloadFile.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoDownloadFile.java
@@ -22,7 +22,7 @@ import java.util.List;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.junit.Assert;
@@ -34,7 +34,7 @@ public class ConsumerAutoDownloadFile extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush://" + Endpoint.getMessage + "?authorizationToken=4 File&autoDownload=true")
+                from("soroush://" + SoroushAction.getMessage + "?authorizationToken=4 File&autoDownload=true")
                         .to("mock:soroush");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoReconnectAfterIdleTimeoutTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoReconnectAfterIdleTimeoutTest.java
index 3d32527..ac59869 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoReconnectAfterIdleTimeoutTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerAutoReconnectAfterIdleTimeoutTest.java
@@ -20,7 +20,7 @@ package org.apache.camel.component.soroushbot.component;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.junit.Test;
 
@@ -31,7 +31,7 @@ public class ConsumerAutoReconnectAfterIdleTimeoutTest extends SoroushBotTestSup
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush://" + Endpoint.getMessage + "/7 delay 100?reconnectIdleConnectionTimeout=200&maxConnectionRetry=0")
+                from("soroush://" + SoroushAction.getMessage + "/7 delay 100?reconnectIdleConnectionTimeout=200&maxConnectionRetry=0")
                         .to("mock:result");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerCamelConcurrentTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerCamelConcurrentTest.java
index de40280..af755c3 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerCamelConcurrentTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerCamelConcurrentTest.java
@@ -22,7 +22,7 @@ import java.util.List;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.apache.logging.log4j.LogManager;
@@ -37,7 +37,7 @@ public class ConsumerCamelConcurrentTest extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush://" + Endpoint.getMessage + "/10").threads().poolSize(4).process(exchange -> {
+                from("soroush://" + SoroushAction.getMessage + "/10").threads().poolSize(4).process(exchange -> {
                     SoroushMessage message = exchange.getIn().getBody(SoroushMessage.class);
                     String from = message.getFrom();
                     //message from u0 (0,4,8) should be processed at the end
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerExceptionHandledWithErrorHandler.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerExceptionHandledWithErrorHandler.java
index 86e78c4..4c26dad 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerExceptionHandledWithErrorHandler.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerExceptionHandledWithErrorHandler.java
@@ -20,7 +20,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.apache.camel.component.soroushbot.utils.CongestionException;
@@ -38,7 +38,7 @@ public class ConsumerExceptionHandledWithErrorHandler extends SoroushBotTestSupp
                         exchange.setProperty(Exchange.ROUTE_STOP, true);
                     }
                 }).handled(true).to("mock:exceptionRoute");
-                from("soroush://" + Endpoint.getMessage + "/7?concurrentConsumers=2&queueCapacityPerThread=1&bridgeErrorHandler=true")
+                from("soroush://" + SoroushAction.getMessage + "/7?concurrentConsumers=2&queueCapacityPerThread=1&bridgeErrorHandler=true")
                         .process(exchange -> Thread.sleep(1000))
                         .to("mock:mainRoute");
 
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerMultiThread.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerMultiThread.java
index 76e9c31..da55107 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerMultiThread.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerMultiThread.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.soroushbot.component;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.junit.Test;
 
@@ -39,7 +39,7 @@ public class ConsumerMultiThread extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush://" + Endpoint.getMessage + "/5")
+                from("soroush://" + SoroushAction.getMessage + "/5")
                         .threads(5).process(exchange -> {
                             Thread.sleep(1000);
                         }
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerNativeConcurrentTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerNativeConcurrentTest.java
index a5e55ee..e4f2249 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerNativeConcurrentTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerNativeConcurrentTest.java
@@ -23,7 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.apache.logging.log4j.LogManager;
@@ -40,7 +40,7 @@ public class ConsumerNativeConcurrentTest extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush://" + Endpoint.getMessage + "/10?concurrentConsumers=3&maxConnectionRetry=0").process(exchange -> {
+                from("soroush://" + SoroushAction.getMessage + "/10?concurrentConsumers=3&maxConnectionRetry=0").process(exchange -> {
                     String from = exchange.getIn().getBody(SoroushMessage.class).getFrom();
                     Thread currentThread = Thread.currentThread();
                     Thread previousThread = userToThread.putIfAbsent(from, currentThread);
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerQueueCapacityPerThread.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerQueueCapacityPerThread.java
index f876b3c..85cc26e 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerQueueCapacityPerThread.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerQueueCapacityPerThread.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.soroushbot.component;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.junit.Test;
 
@@ -29,7 +29,7 @@ public class ConsumerQueueCapacityPerThread extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush:" + Endpoint.getMessage + "/150?queueCapacityPerThread=1&concurrentConsumers=2")
+                from("soroush:" + SoroushAction.getMessage + "/150?queueCapacityPerThread=1&concurrentConsumers=2")
                         .process(exchange -> {
                             Thread.sleep(1000);
                         }).to("mock:ConsumerQueueCapacityPerThread");
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerRetryOnConnectionFailure.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerRetryOnConnectionFailure.java
index a2e746c..5d4bf1c 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerRetryOnConnectionFailure.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerRetryOnConnectionFailure.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.soroushbot.component;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.junit.Test;
 
@@ -29,7 +29,7 @@ public class ConsumerRetryOnConnectionFailure extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush://" + Endpoint.getMessage + "/5 CLOSE?maxConnectionRetry=1")
+                from("soroush://" + SoroushAction.getMessage + "/5 CLOSE?maxConnectionRetry=1")
                         .to("mock:ConsumerRetryOnConnectionFailure");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerTest.java
index 665a0b8..bb543af 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ConsumerTest.java
@@ -19,7 +19,7 @@ package org.apache.camel.component.soroushbot.component;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.apache.logging.log4j.LogManager;
@@ -44,7 +44,7 @@ public class ConsumerTest extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("soroush://" + Endpoint.getMessage + "/5")
+                from("soroush://" + SoroushAction.getMessage + "/5")
                         .process(exchange -> {
                             LogManager.getLogger().info("get a message");
                             if (exchange.getIn().getBody(SoroushMessage.class).getBody()
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ExponentialBackOffProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ExponentialBackOffProducerConnectionRetryTest.java
index 7c690bd..523d472 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ExponentialBackOffProducerConnectionRetryTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ExponentialBackOffProducerConnectionRetryTest.java
@@ -20,7 +20,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -46,7 +46,7 @@ public class ExponentialBackOffProducerConnectionRetryTest extends SoroushBotTes
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/retry 5?maxConnectionRetry=5"
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
                         + "&retryWaitingTime=500&retryExponentialCoefficient=2&backOffStrategy=exponential")
                         .to("mock:afterAllRetry")
                         .to("mock:beforeAllRetry");
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/FixedBackOffProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/FixedBackOffProducerConnectionRetryTest.java
index e6db62b..c3534f5 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/FixedBackOffProducerConnectionRetryTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/FixedBackOffProducerConnectionRetryTest.java
@@ -20,7 +20,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -46,7 +46,7 @@ public class FixedBackOffProducerConnectionRetryTest extends SoroushBotTestSuppo
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/retry 5?maxConnectionRetry=5"
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
                         + "&retryWaitingTime=500&backOffStrategy=fixed")
                         .to("mock:afterAllRetry")
                         .to("mock:beforeAllRetry");
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/HandleExceptionWithErrorHandler.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/HandleExceptionWithErrorHandler.java
index 338aa7d..effb672 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/HandleExceptionWithErrorHandler.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/HandleExceptionWithErrorHandler.java
@@ -22,7 +22,7 @@ import java.io.FileNotFoundException;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
 import org.junit.Assert;
@@ -35,7 +35,7 @@ public class HandleExceptionWithErrorHandler extends SoroushBotTestSupport {
             @Override
             public void configure() {
                 onException(FileNotFoundException.class).to("mock:exceptionRoute");
-                from("soroush://" + Endpoint.getMessage + "/5?concurrentConsumers=2")
+                from("soroush://" + SoroushAction.getMessage + "/5?concurrentConsumers=2")
                         .process(exchange -> {
                             SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
                             File file = new File("badFile-ShouldNotExits");
@@ -43,7 +43,7 @@ public class HandleExceptionWithErrorHandler extends SoroushBotTestSupport {
                             body.setFile(file);
                             body.setTo(body.getFrom());
                         })
-                        .to("soroush://" + Endpoint.sendMessage + "/token")
+                        .to("soroush://" + SoroushAction.sendMessage + "/token")
                         .to("mock:mainRoute");
 
             }
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/LinearBackOffProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/LinearBackOffProducerConnectionRetryTest.java
index b698903..a877119 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/LinearBackOffProducerConnectionRetryTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/LinearBackOffProducerConnectionRetryTest.java
@@ -20,7 +20,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -46,7 +46,7 @@ public class LinearBackOffProducerConnectionRetryTest extends SoroushBotTestSupp
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/retry 5?maxConnectionRetry=5"
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
                         + "&retryWaitingTime=500&retryLinearIncrement=1000&backOffStrategy=linear")
                         .to("mock:afterAllRetry")
                         .to("mock:beforeAllRetry");
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/MaxRetryWaitingTimeProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/MaxRetryWaitingTimeProducerConnectionRetryTest.java
index 9a55d15..d14231c 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/MaxRetryWaitingTimeProducerConnectionRetryTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/MaxRetryWaitingTimeProducerConnectionRetryTest.java
@@ -20,7 +20,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -46,7 +46,7 @@ public class MaxRetryWaitingTimeProducerConnectionRetryTest extends SoroushBotTe
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/retry 5?maxConnectionRetry=5"
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 5?maxConnectionRetry=5"
                         + "&retryWaitingTime=500&retryExponentialCoefficient=2&backOffStrategy=exponential&maxRetryWaitingTime=2500")
                         .to("mock:afterAllRetry")
                         .to("mock:beforeAllRetry");
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFile.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFile.java
index 0ac2481..273d64b 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFile.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFile.java
@@ -23,7 +23,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -49,7 +49,7 @@ public class ProducerAutoUploadFile extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/token")
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
                         .process(exchange -> {
                             SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
                             if (body.getFileUrl() == null) {
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileIsFalse.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileIsFalse.java
index 70c28a5..c73560c 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileIsFalse.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerAutoUploadFileIsFalse.java
@@ -23,7 +23,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -49,7 +49,7 @@ public class ProducerAutoUploadFileIsFalse extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/token?autoUploadFile=false")
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token?autoUploadFile=false")
                         .process(exchange -> {
                             SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
                             if (body.getFileUrl() != null) {
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerConnectionRetryTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerConnectionRetryTest.java
index b82012c..61ae83d 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerConnectionRetryTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerConnectionRetryTest.java
@@ -20,7 +20,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -46,7 +46,7 @@ public class ProducerConnectionRetryTest extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/retry 2?maxConnectionRetry=2")
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 2?maxConnectionRetry=2")
                         .to("mock:soroush");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFile.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFile.java
index ce63d61..3da06fb 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFile.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFile.java
@@ -25,7 +25,7 @@ import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.component.soroushbot.IOUtils;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -52,13 +52,13 @@ public class ProducerDownloadFile extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/token")
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
                         .process(exchange -> {
                             SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
                             body.setFile((InputStream) null);
                             body.setThumbnail((InputStream) null);
                         })
-                        .to("soroush://" + Endpoint.downloadFile + "/token")
+                        .to("soroush://" + SoroushAction.downloadFile + "/token")
                         .to("mock:soroush");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileWithoutThumbnail.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileWithoutThumbnail.java
index 23626f2..d984c7c 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileWithoutThumbnail.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerDownloadFileWithoutThumbnail.java
@@ -25,7 +25,7 @@ import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.component.soroushbot.IOUtils;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -52,13 +52,13 @@ public class ProducerDownloadFileWithoutThumbnail extends SoroushBotTestSupport
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/token")
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
                         .process(exchange -> {
                             SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
                             body.setFile((InputStream) null);
                             body.setThumbnail((InputStream) null);
                         })
-                        .to("soroush://" + Endpoint.downloadFile + "/token?downloadThumbnail=false")
+                        .to("soroush://" + SoroushAction.downloadFile + "/token?downloadThumbnail=false")
                         .to("mock:soroush");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerMaxConnectionRetryReachedTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerMaxConnectionRetryReachedTest.java
index b9b90dc..e26b496 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerMaxConnectionRetryReachedTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerMaxConnectionRetryReachedTest.java
@@ -21,7 +21,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -47,7 +47,7 @@ public class ProducerMaxConnectionRetryReachedTest extends SoroushBotTestSupport
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/retry 3?maxConnectionRetry=2")
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/retry 3?maxConnectionRetry=2")
                         .to("mock:soroush");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerTest.java
index 7834b7f..a40e985 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerTest.java
@@ -20,7 +20,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -46,7 +46,7 @@ public class ProducerTest extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.sendMessage + "/token")
+                from("direct:soroush").to("soroush://" + SoroushAction.sendMessage + "/token")
                         .to("mock:soroush");
             }
         };
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerUploadFile.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerUploadFile.java
index a458fff..7631872 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerUploadFile.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/component/ProducerUploadFile.java
@@ -23,7 +23,7 @@ import org.apache.camel.EndpointInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.support.SoroushBotTestSupport;
@@ -49,7 +49,7 @@ public class ProducerUploadFile extends SoroushBotTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:soroush").to("soroush://" + Endpoint.uploadFile + "/token")
+                from("direct:soroush").to("soroush://" + SoroushAction.uploadFile + "/token")
                         .process(exchange -> {
                             SoroushMessage body = exchange.getIn().getBody(SoroushMessage.class);
                             if (body.getFileUrl() == null) {
diff --git a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/service/SoroushServiceTest.java b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/service/SoroushServiceTest.java
index 8bf0034..ffe032b 100644
--- a/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/service/SoroushServiceTest.java
+++ b/components/camel-soroush/src/test/java/org/apache/camel/component/soroushbot/service/SoroushServiceTest.java
@@ -28,7 +28,7 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 import org.apache.camel.component.soroushbot.IOUtils;
-import org.apache.camel.component.soroushbot.models.Endpoint;
+import org.apache.camel.component.soroushbot.models.SoroushAction;
 import org.apache.camel.component.soroushbot.models.MinorType;
 import org.apache.camel.component.soroushbot.models.SoroushMessage;
 import org.apache.camel.component.soroushbot.models.response.UploadFileResponse;
@@ -70,7 +70,7 @@ public class SoroushServiceTest {
     public void connectToGetMessageEndPoint() {
         Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
         client.property(ClientProperties.CONNECT_TIMEOUT, 2000);
-        WebTarget target = client.target(soroushService.generateUrl(authorizationToken, Endpoint.getMessage, null));
+        WebTarget target = client.target(soroushService.generateUrl(authorizationToken, SoroushAction.getMessage, null));
         EventInput eventInput = target.request().get(EventInput.class);
         eventInput.setChunkType(MediaType.SERVER_SENT_EVENTS);
         Assert.assertFalse(eventInput.isClosed());
@@ -80,7 +80,7 @@ public class SoroushServiceTest {
     public void canNotReadMessageDueToWrongAuthorizationToken() {
         Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
         client.property(ClientProperties.CONNECT_TIMEOUT, 2000);
-        WebTarget target = client.target(soroushService.generateUrl("bad_string" + authorizationToken, Endpoint.getMessage, null));
+        WebTarget target = client.target(soroushService.generateUrl("bad_string" + authorizationToken, SoroushAction.getMessage, null));
         EventInput eventInput = target.request().get(EventInput.class);
         eventInput.setChunkType(MediaType.SERVER_SENT_EVENTS);
         Assert.assertFalse(eventInput.isClosed());
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/SoroushBotEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/SoroushBotEndpointBuilderFactory.java
index 4b8e48f..9a689b4 100644
--- a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/SoroushBotEndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/SoroushBotEndpointBuilderFactory.java
@@ -42,27 +42,67 @@ public interface SoroushBotEndpointBuilderFactory {
             return (AdvancedSoroushBotEndpointConsumerBuilder) this;
         }
         /**
-         * The endpoint type. Support getMessage as consumer and
-         * sendMessage,uploadFile,downloadFile as producer.
+         * The action to do.
          * The option is a
-         * <code>org.apache.camel.component.soroushbot.models.Endpoint</code>
-         * type.
+         * <code>org.apache.camel.component.soroushbot.models.SoroushAction</code> type.
          * @group common
          */
-        default SoroushBotEndpointConsumerBuilder endpoint(Endpoint endpoint) {
-            setProperty("endpoint", endpoint);
+        default SoroushBotEndpointConsumerBuilder action(SoroushAction action) {
+            setProperty("action", action);
             return this;
         }
         /**
-         * The endpoint type. Support getMessage as consumer and
-         * sendMessage,uploadFile,downloadFile as producer.
+         * The action to do.
          * The option will be converted to a
-         * <code>org.apache.camel.component.soroushbot.models.Endpoint</code>
-         * type.
+         * <code>org.apache.camel.component.soroushbot.models.SoroushAction</code> type.
+         * @group common
+         */
+        default SoroushBotEndpointConsumerBuilder action(String action) {
+            setProperty("action", action);
+            return this;
+        }
+        /**
+         * Connection timeout in ms when connecting to soroush API.
+         * The option is a <code>int</code> type.
+         * @group common
+         */
+        default SoroushBotEndpointConsumerBuilder connectionTimeout(
+                int connectionTimeout) {
+            setProperty("connectionTimeout", connectionTimeout);
+            return this;
+        }
+        /**
+         * Connection timeout in ms when connecting to soroush API.
+         * The option will be converted to a <code>int</code> type.
+         * @group common
+         */
+        default SoroushBotEndpointConsumerBuilder connectionTimeout(
+                String connectionTimeout) {
+            setProperty("connectionTimeout", connectionTimeout);
+            return this;
+        }
+        /**
+         * Maximum connection retry when fail to connect to soroush API, if the
+         * quota is reached, MaximumConnectionRetryReachedException is thrown
+         * for that message.
+         * The option is a <code>int</code> type.
+         * @group common
+         */
+        default SoroushBotEndpointConsumerBuilder maxConnectionRetry(
+                int maxConnectionRetry) {
+            setProperty("maxConnectionRetry", maxConnectionRetry);
+            return this;
+        }
+        /**
+         * Maximum connection retry when fail to connect to soroush API, if the
+         * quota is reached, MaximumConnectionRetryReachedException is thrown
+         * for that message.
+         * The option will be converted to a <code>int</code> type.
          * @group common
          */
-        default SoroushBotEndpointConsumerBuilder endpoint(String endpoint) {
-            setProperty("endpoint", endpoint);
+        default SoroushBotEndpointConsumerBuilder maxConnectionRetry(
+                String maxConnectionRetry) {
+            setProperty("maxConnectionRetry", maxConnectionRetry);
             return this;
         }
         /**
@@ -103,11 +143,11 @@ public interface SoroushBotEndpointBuilderFactory {
          * always execute in the same thread and therefore messages from the
          * same user are processed sequentially. Default value notice: using
          * SoroushBotSingleThreadConsumer.
-         * The option is a <code>java.lang.Integer</code> type.
+         * The option is a <code>int</code> type.
          * @group consumer
          */
         default SoroushBotEndpointConsumerBuilder concurrentConsumers(
-                Integer concurrentConsumers) {
+                int concurrentConsumers) {
             setProperty("concurrentConsumers", concurrentConsumers);
             return this;
         }
@@ -117,8 +157,7 @@ public interface SoroushBotEndpointBuilderFactory {
          * always execute in the same thread and therefore messages from the
          * same user are processed sequentially. Default value notice: using
          * SoroushBotSingleThreadConsumer.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
+         * The option will be converted to a <code>int</code> type.
          * @group consumer
          */
         default SoroushBotEndpointConsumerBuilder concurrentConsumers(
@@ -134,11 +173,11 @@ public interface SoroushBotEndpointBuilderFactory {
          * can then processed the error using
          * onException(CongestionException.class) route. Default value notice:
          * infinite capacity.
-         * The option is a <code>java.lang.Integer</code> type.
+         * The option is a <code>int</code> type.
          * @group consumer
          */
         default SoroushBotEndpointConsumerBuilder queueCapacityPerThread(
-                Integer queueCapacityPerThread) {
+                int queueCapacityPerThread) {
             setProperty("queueCapacityPerThread", queueCapacityPerThread);
             return this;
         }
@@ -150,8 +189,7 @@ public interface SoroushBotEndpointBuilderFactory {
          * can then processed the error using
          * onException(CongestionException.class) route. Default value notice:
          * infinite capacity.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
+         * The option will be converted to a <code>int</code> type.
          * @group consumer
          */
         default SoroushBotEndpointConsumerBuilder queueCapacityPerThread(
@@ -160,102 +198,14 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
-         * Automatically download SoroushMessage.fileUrl and
-         * SoroushMessage.thumbnailUrl if exists for the message and store them
-         * in SoroushMessage.file and SoroushMessage.thumbnail field.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointConsumerBuilder autoDownload(
-                Boolean autoDownload) {
-            setProperty("autoDownload", autoDownload);
-            return this;
-        }
-        /**
-         * Automatically download SoroushMessage.fileUrl and
-         * SoroushMessage.thumbnailUrl if exists for the message and store them
-         * in SoroushMessage.file and SoroushMessage.thumbnail field.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointConsumerBuilder autoDownload(
-                String autoDownload) {
-            setProperty("autoDownload", autoDownload);
-            return this;
-        }
-        /**
-         * The timeout in millisecond to reconnect the existing getMessage
-         * connection to ensure that the connection is always live and does not
-         * dead without notifying the bot. this value should not be changed.
-         * The option is a <code>long</code> type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointConsumerBuilder reconnectIdleConnectionTimeout(
-                long reconnectIdleConnectionTimeout) {
-            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
-            return this;
-        }
-        /**
-         * The timeout in millisecond to reconnect the existing getMessage
-         * connection to ensure that the connection is always live and does not
-         * dead without notifying the bot. this value should not be changed.
-         * The option will be converted to a <code>long</code> type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointConsumerBuilder reconnectIdleConnectionTimeout(
-                String reconnectIdleConnectionTimeout) {
-            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
-            return this;
-        }
-        /**
-         * If true, when downloading an attached file, thumbnail will be
-         * downloaded if provided in the message. Otherwise, only the file will
-         * be downloaded.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group downloadFile
-         */
-        default SoroushBotEndpointConsumerBuilder downloadThumbnail(
-                Boolean downloadThumbnail) {
-            setProperty("downloadThumbnail", downloadThumbnail);
-            return this;
-        }
-        /**
-         * If true, when downloading an attached file, thumbnail will be
-         * downloaded if provided in the message. Otherwise, only the file will
-         * be downloaded.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group downloadFile
-         */
-        default SoroushBotEndpointConsumerBuilder downloadThumbnail(
-                String downloadThumbnail) {
-            setProperty("downloadThumbnail", downloadThumbnail);
-            return this;
-        }
-        /**
-         * Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl)
-         * if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail)
-         * was not null in that message.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group downloadFile
-         */
-        default SoroushBotEndpointConsumerBuilder forceDownload(
-                Boolean forceDownload) {
-            setProperty("forceDownload", forceDownload);
-            return this;
-        }
-        /**
-         * Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl)
-         * if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail)
-         * was not null in that message.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group downloadFile
+         * The authorization token for using the bot. if uri path does not
+         * contain authorization token, this token will be used.
+         * The option is a <code>java.lang.String</code> type.
+         * @group security
          */
-        default SoroushBotEndpointConsumerBuilder forceDownload(
-                String forceDownload) {
-            setProperty("forceDownload", forceDownload);
+        default SoroushBotEndpointConsumerBuilder authorizationToken(
+                String authorizationToken) {
+            setProperty("authorizationToken", authorizationToken);
             return this;
         }
         /**
@@ -266,7 +216,7 @@ public interface SoroushBotEndpointBuilderFactory {
          * retryLinearIncrement after each connection failure. 3. Fixed: Always
          * use retryWaitingTime as the time between retries.
          * The option is a <code>java.lang.String</code> type.
-         * @group global
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder backOffStrategy(
                 String backOffStrategy) {
@@ -274,67 +224,21 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
-         * Connection timeout in ms when connecting to soroush API.
-         * The option is a <code>java.lang.Integer</code> type.
-         * @group global
-         */
-        default SoroushBotEndpointConsumerBuilder connectionTimeout(
-                Integer connectionTimeout) {
-            setProperty("connectionTimeout", connectionTimeout);
-            return this;
-        }
-        /**
-         * Connection timeout in ms when connecting to soroush API.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
-         * @group global
-         */
-        default SoroushBotEndpointConsumerBuilder connectionTimeout(
-                String connectionTimeout) {
-            setProperty("connectionTimeout", connectionTimeout);
-            return this;
-        }
-        /**
-         * Maximum connection retry when fail to connect to soroush API, if the
-         * quota is reached, MaximumConnectionRetryReachedException is thrown
-         * for that message.
-         * The option is a <code>java.lang.Integer</code> type.
-         * @group global
-         */
-        default SoroushBotEndpointConsumerBuilder maxConnectionRetry(
-                Integer maxConnectionRetry) {
-            setProperty("maxConnectionRetry", maxConnectionRetry);
-            return this;
-        }
-        /**
-         * Maximum connection retry when fail to connect to soroush API, if the
-         * quota is reached, MaximumConnectionRetryReachedException is thrown
-         * for that message.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
-         * @group global
-         */
-        default SoroushBotEndpointConsumerBuilder maxConnectionRetry(
-                String maxConnectionRetry) {
-            setProperty("maxConnectionRetry", maxConnectionRetry);
-            return this;
-        }
-        /**
          * Maximum amount of time (in millisecond) a thread wait before retrying
          * failed request.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder maxRetryWaitingTime(
-                Long maxRetryWaitingTime) {
+                long maxRetryWaitingTime) {
             setProperty("maxRetryWaitingTime", maxRetryWaitingTime);
             return this;
         }
         /**
          * Maximum amount of time (in millisecond) a thread wait before retrying
          * failed request.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder maxRetryWaitingTime(
                 String maxRetryWaitingTime) {
@@ -342,21 +246,45 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
+         * The timeout in millisecond to reconnect the existing getMessage
+         * connection to ensure that the connection is always live and does not
+         * dead without notifying the bot. this value should not be changed.
+         * The option is a <code>long</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointConsumerBuilder reconnectIdleConnectionTimeout(
+                long reconnectIdleConnectionTimeout) {
+            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+            return this;
+        }
+        /**
+         * The timeout in millisecond to reconnect the existing getMessage
+         * connection to ensure that the connection is always live and does not
+         * dead without notifying the bot. this value should not be changed.
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointConsumerBuilder reconnectIdleConnectionTimeout(
+                String reconnectIdleConnectionTimeout) {
+            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+            return this;
+        }
+        /**
          * Coefficient to compute back off time when using Exponential Back Off
          * strategy.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder retryExponentialCoefficient(
-                Long retryExponentialCoefficient) {
+                long retryExponentialCoefficient) {
             setProperty("retryExponentialCoefficient", retryExponentialCoefficient);
             return this;
         }
         /**
          * Coefficient to compute back off time when using Exponential Back Off
          * strategy.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder retryExponentialCoefficient(
                 String retryExponentialCoefficient) {
@@ -366,19 +294,19 @@ public interface SoroushBotEndpointBuilderFactory {
         /**
          * The amount of time (in millisecond) which adds to waiting time when
          * using Linear back off strategy.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder retryLinearIncrement(
-                Long retryLinearIncrement) {
+                long retryLinearIncrement) {
             setProperty("retryLinearIncrement", retryLinearIncrement);
             return this;
         }
         /**
          * The amount of time (in millisecond) which adds to waiting time when
          * using Linear back off strategy.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder retryLinearIncrement(
                 String retryLinearIncrement) {
@@ -390,11 +318,11 @@ public interface SoroushBotEndpointBuilderFactory {
          * backOffStrategy is not Fixed this is the based value for computing
          * back off waiting time. the first retry is always happen immediately
          * after failure and retryWaitingTime do not apply to the first retry.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder retryWaitingTime(
-                Long retryWaitingTime) {
+                long retryWaitingTime) {
             setProperty("retryWaitingTime", retryWaitingTime);
             return this;
         }
@@ -403,78 +331,14 @@ public interface SoroushBotEndpointBuilderFactory {
          * backOffStrategy is not Fixed this is the based value for computing
          * back off waiting time. the first retry is always happen immediately
          * after failure and retryWaitingTime do not apply to the first retry.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointConsumerBuilder retryWaitingTime(
                 String retryWaitingTime) {
             setProperty("retryWaitingTime", retryWaitingTime);
             return this;
         }
-        /**
-         * The authorization token for using the bot. if uri path does not
-         * contain authorization token, this token will be used.
-         * The option is a <code>java.lang.String</code> type.
-         * @group security
-         */
-        default SoroushBotEndpointConsumerBuilder authorizationToken(
-                String authorizationToken) {
-            setProperty("authorizationToken", authorizationToken);
-            return this;
-        }
-        /**
-         * Automatically upload attachments when a message goes to the
-         * sendMessage endpoint and the SoroushMessage.file
-         * (SoroushMessage.thumbnail) has been set and
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group sendMessage
-         */
-        default SoroushBotEndpointConsumerBuilder autoUploadFile(
-                Boolean autoUploadFile) {
-            setProperty("autoUploadFile", autoUploadFile);
-            return this;
-        }
-        /**
-         * Automatically upload attachments when a message goes to the
-         * sendMessage endpoint and the SoroushMessage.file
-         * (SoroushMessage.thumbnail) has been set and
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group sendMessage
-         */
-        default SoroushBotEndpointConsumerBuilder autoUploadFile(
-                String autoUploadFile) {
-            setProperty("autoUploadFile", autoUploadFile);
-            return this;
-        }
-        /**
-         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
-         * exists, even if the
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
-         * the message.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group uploadFile
-         */
-        default SoroushBotEndpointConsumerBuilder forceUpload(
-                Boolean forceUpload) {
-            setProperty("forceUpload", forceUpload);
-            return this;
-        }
-        /**
-         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
-         * exists, even if the
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
-         * the message.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group uploadFile
-         */
-        default SoroushBotEndpointConsumerBuilder forceUpload(String forceUpload) {
-            setProperty("forceUpload", forceUpload);
-            return this;
-        }
     }
 
     /**
@@ -591,74 +455,78 @@ public interface SoroushBotEndpointBuilderFactory {
             return (AdvancedSoroushBotEndpointProducerBuilder) this;
         }
         /**
-         * The endpoint type. Support getMessage as consumer and
-         * sendMessage,uploadFile,downloadFile as producer.
+         * The action to do.
          * The option is a
-         * <code>org.apache.camel.component.soroushbot.models.Endpoint</code>
-         * type.
+         * <code>org.apache.camel.component.soroushbot.models.SoroushAction</code> type.
          * @group common
          */
-        default SoroushBotEndpointProducerBuilder endpoint(Endpoint endpoint) {
-            setProperty("endpoint", endpoint);
+        default SoroushBotEndpointProducerBuilder action(SoroushAction action) {
+            setProperty("action", action);
             return this;
         }
         /**
-         * The endpoint type. Support getMessage as consumer and
-         * sendMessage,uploadFile,downloadFile as producer.
+         * The action to do.
          * The option will be converted to a
-         * <code>org.apache.camel.component.soroushbot.models.Endpoint</code>
-         * type.
+         * <code>org.apache.camel.component.soroushbot.models.SoroushAction</code> type.
          * @group common
          */
-        default SoroushBotEndpointProducerBuilder endpoint(String endpoint) {
-            setProperty("endpoint", endpoint);
+        default SoroushBotEndpointProducerBuilder action(String action) {
+            setProperty("action", action);
             return this;
         }
         /**
-         * Whether the producer should be started lazy (on the first message).
-         * By starting lazy you can use this to allow CamelContext and routes to
-         * startup in situations where a producer may otherwise fail during
-         * starting and cause the route to fail being started. By deferring this
-         * startup to be lazy then the startup failure can be handled during
-         * routing messages via Camel's routing error handlers. Beware that when
-         * the first message is processed then creating and starting the
-         * producer may take a little time and prolong the total processing time
-         * of the processing.
-         * The option is a <code>boolean</code> type.
-         * @group producer
+         * Connection timeout in ms when connecting to soroush API.
+         * The option is a <code>int</code> type.
+         * @group common
          */
-        default SoroushBotEndpointProducerBuilder lazyStartProducer(
-                boolean lazyStartProducer) {
-            setProperty("lazyStartProducer", lazyStartProducer);
-            return this;
+        default SoroushBotEndpointProducerBuilder connectionTimeout(
+                int connectionTimeout) {
+            setProperty("connectionTimeout", connectionTimeout);
+            return this;
         }
         /**
-         * Whether the producer should be started lazy (on the first message).
-         * By starting lazy you can use this to allow CamelContext and routes to
-         * startup in situations where a producer may otherwise fail during
-         * starting and cause the route to fail being started. By deferring this
-         * startup to be lazy then the startup failure can be handled during
-         * routing messages via Camel's routing error handlers. Beware that when
-         * the first message is processed then creating and starting the
-         * producer may take a little time and prolong the total processing time
-         * of the processing.
-         * The option will be converted to a <code>boolean</code> type.
-         * @group producer
+         * Connection timeout in ms when connecting to soroush API.
+         * The option will be converted to a <code>int</code> type.
+         * @group common
          */
-        default SoroushBotEndpointProducerBuilder lazyStartProducer(
-                String lazyStartProducer) {
-            setProperty("lazyStartProducer", lazyStartProducer);
+        default SoroushBotEndpointProducerBuilder connectionTimeout(
+                String connectionTimeout) {
+            setProperty("connectionTimeout", connectionTimeout);
+            return this;
+        }
+        /**
+         * Maximum connection retry when fail to connect to soroush API, if the
+         * quota is reached, MaximumConnectionRetryReachedException is thrown
+         * for that message.
+         * The option is a <code>int</code> type.
+         * @group common
+         */
+        default SoroushBotEndpointProducerBuilder maxConnectionRetry(
+                int maxConnectionRetry) {
+            setProperty("maxConnectionRetry", maxConnectionRetry);
+            return this;
+        }
+        /**
+         * Maximum connection retry when fail to connect to soroush API, if the
+         * quota is reached, MaximumConnectionRetryReachedException is thrown
+         * for that message.
+         * The option will be converted to a <code>int</code> type.
+         * @group common
+         */
+        default SoroushBotEndpointProducerBuilder maxConnectionRetry(
+                String maxConnectionRetry) {
+            setProperty("maxConnectionRetry", maxConnectionRetry);
             return this;
         }
         /**
          * Automatically download SoroushMessage.fileUrl and
          * SoroushMessage.thumbnailUrl if exists for the message and store them
          * in SoroushMessage.file and SoroushMessage.thumbnail field.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group getMessage
+         * The option is a <code>boolean</code> type.
+         * @group producer
          */
         default SoroushBotEndpointProducerBuilder autoDownload(
-                Boolean autoDownload) {
+                boolean autoDownload) {
             setProperty("autoDownload", autoDownload);
             return this;
         }
@@ -666,9 +534,8 @@ public interface SoroushBotEndpointBuilderFactory {
          * Automatically download SoroushMessage.fileUrl and
          * SoroushMessage.thumbnailUrl if exists for the message and store them
          * in SoroushMessage.file and SoroushMessage.thumbnail field.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group getMessage
+         * The option will be converted to a <code>boolean</code> type.
+         * @group producer
          */
         default SoroushBotEndpointProducerBuilder autoDownload(
                 String autoDownload) {
@@ -676,38 +543,40 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
-         * The timeout in millisecond to reconnect the existing getMessage
-         * connection to ensure that the connection is always live and does not
-         * dead without notifying the bot. this value should not be changed.
-         * The option is a <code>long</code> type.
-         * @group getMessage
+         * Automatically upload attachments when a message goes to the
+         * sendMessage endpoint and the SoroushMessage.file
+         * (SoroushMessage.thumbnail) has been set and
+         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
+         * The option is a <code>boolean</code> type.
+         * @group producer
          */
-        default SoroushBotEndpointProducerBuilder reconnectIdleConnectionTimeout(
-                long reconnectIdleConnectionTimeout) {
-            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+        default SoroushBotEndpointProducerBuilder autoUploadFile(
+                boolean autoUploadFile) {
+            setProperty("autoUploadFile", autoUploadFile);
             return this;
         }
         /**
-         * The timeout in millisecond to reconnect the existing getMessage
-         * connection to ensure that the connection is always live and does not
-         * dead without notifying the bot. this value should not be changed.
-         * The option will be converted to a <code>long</code> type.
-         * @group getMessage
+         * Automatically upload attachments when a message goes to the
+         * sendMessage endpoint and the SoroushMessage.file
+         * (SoroushMessage.thumbnail) has been set and
+         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
+         * The option will be converted to a <code>boolean</code> type.
+         * @group producer
          */
-        default SoroushBotEndpointProducerBuilder reconnectIdleConnectionTimeout(
-                String reconnectIdleConnectionTimeout) {
-            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+        default SoroushBotEndpointProducerBuilder autoUploadFile(
+                String autoUploadFile) {
+            setProperty("autoUploadFile", autoUploadFile);
             return this;
         }
         /**
          * If true, when downloading an attached file, thumbnail will be
          * downloaded if provided in the message. Otherwise, only the file will
          * be downloaded.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group downloadFile
+         * The option is a <code>boolean</code> type.
+         * @group producer
          */
         default SoroushBotEndpointProducerBuilder downloadThumbnail(
-                Boolean downloadThumbnail) {
+                boolean downloadThumbnail) {
             setProperty("downloadThumbnail", downloadThumbnail);
             return this;
         }
@@ -715,9 +584,8 @@ public interface SoroushBotEndpointBuilderFactory {
          * If true, when downloading an attached file, thumbnail will be
          * downloaded if provided in the message. Otherwise, only the file will
          * be downloaded.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group downloadFile
+         * The option will be converted to a <code>boolean</code> type.
+         * @group producer
          */
         default SoroushBotEndpointProducerBuilder downloadThumbnail(
                 String downloadThumbnail) {
@@ -728,11 +596,11 @@ public interface SoroushBotEndpointBuilderFactory {
          * Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl)
          * if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail)
          * was not null in that message.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group downloadFile
+         * The option is a <code>boolean</code> type.
+         * @group producer
          */
         default SoroushBotEndpointProducerBuilder forceDownload(
-                Boolean forceDownload) {
+                boolean forceDownload) {
             setProperty("forceDownload", forceDownload);
             return this;
         }
@@ -740,9 +608,8 @@ public interface SoroushBotEndpointBuilderFactory {
          * Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl)
          * if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail)
          * was not null in that message.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group downloadFile
+         * The option will be converted to a <code>boolean</code> type.
+         * @group producer
          */
         default SoroushBotEndpointProducerBuilder forceDownload(
                 String forceDownload) {
@@ -750,82 +617,108 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
-         * The strategy to backoff in case of connection failure. Currently 3
-         * strategies are supported: 1. Exponential (default): It multiply
-         * retryWaitingTime by retryExponentialCoefficient after each connection
-         * failure. 2. Linear: It increase retryWaitingTime by
-         * retryLinearIncrement after each connection failure. 3. Fixed: Always
-         * use retryWaitingTime as the time between retries.
-         * The option is a <code>java.lang.String</code> type.
-         * @group global
+         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
+         * exists, even if the
+         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
+         * the message.
+         * The option is a <code>boolean</code> type.
+         * @group producer
          */
-        default SoroushBotEndpointProducerBuilder backOffStrategy(
-                String backOffStrategy) {
-            setProperty("backOffStrategy", backOffStrategy);
+        default SoroushBotEndpointProducerBuilder forceUpload(
+                boolean forceUpload) {
+            setProperty("forceUpload", forceUpload);
             return this;
         }
         /**
-         * Connection timeout in ms when connecting to soroush API.
-         * The option is a <code>java.lang.Integer</code> type.
-         * @group global
+         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
+         * exists, even if the
+         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
+         * the message.
+         * The option will be converted to a <code>boolean</code> type.
+         * @group producer
          */
-        default SoroushBotEndpointProducerBuilder connectionTimeout(
-                Integer connectionTimeout) {
-            setProperty("connectionTimeout", connectionTimeout);
+        default SoroushBotEndpointProducerBuilder forceUpload(String forceUpload) {
+            setProperty("forceUpload", forceUpload);
             return this;
         }
         /**
-         * Connection timeout in ms when connecting to soroush API.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
-         * @group global
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * The option is a <code>boolean</code> type.
+         * @group producer
          */
-        default SoroushBotEndpointProducerBuilder connectionTimeout(
-                String connectionTimeout) {
-            setProperty("connectionTimeout", connectionTimeout);
+        default SoroushBotEndpointProducerBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            setProperty("lazyStartProducer", lazyStartProducer);
             return this;
         }
         /**
-         * Maximum connection retry when fail to connect to soroush API, if the
-         * quota is reached, MaximumConnectionRetryReachedException is thrown
-         * for that message.
-         * The option is a <code>java.lang.Integer</code> type.
-         * @group global
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * The option will be converted to a <code>boolean</code> type.
+         * @group producer
          */
-        default SoroushBotEndpointProducerBuilder maxConnectionRetry(
-                Integer maxConnectionRetry) {
-            setProperty("maxConnectionRetry", maxConnectionRetry);
+        default SoroushBotEndpointProducerBuilder lazyStartProducer(
+                String lazyStartProducer) {
+            setProperty("lazyStartProducer", lazyStartProducer);
             return this;
         }
         /**
-         * Maximum connection retry when fail to connect to soroush API, if the
-         * quota is reached, MaximumConnectionRetryReachedException is thrown
-         * for that message.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
-         * @group global
+         * The authorization token for using the bot. if uri path does not
+         * contain authorization token, this token will be used.
+         * The option is a <code>java.lang.String</code> type.
+         * @group security
          */
-        default SoroushBotEndpointProducerBuilder maxConnectionRetry(
-                String maxConnectionRetry) {
-            setProperty("maxConnectionRetry", maxConnectionRetry);
+        default SoroushBotEndpointProducerBuilder authorizationToken(
+                String authorizationToken) {
+            setProperty("authorizationToken", authorizationToken);
+            return this;
+        }
+        /**
+         * The strategy to backoff in case of connection failure. Currently 3
+         * strategies are supported: 1. Exponential (default): It multiply
+         * retryWaitingTime by retryExponentialCoefficient after each connection
+         * failure. 2. Linear: It increase retryWaitingTime by
+         * retryLinearIncrement after each connection failure. 3. Fixed: Always
+         * use retryWaitingTime as the time between retries.
+         * The option is a <code>java.lang.String</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointProducerBuilder backOffStrategy(
+                String backOffStrategy) {
+            setProperty("backOffStrategy", backOffStrategy);
             return this;
         }
         /**
          * Maximum amount of time (in millisecond) a thread wait before retrying
          * failed request.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder maxRetryWaitingTime(
-                Long maxRetryWaitingTime) {
+                long maxRetryWaitingTime) {
             setProperty("maxRetryWaitingTime", maxRetryWaitingTime);
             return this;
         }
         /**
          * Maximum amount of time (in millisecond) a thread wait before retrying
          * failed request.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder maxRetryWaitingTime(
                 String maxRetryWaitingTime) {
@@ -833,21 +726,45 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
+         * The timeout in millisecond to reconnect the existing getMessage
+         * connection to ensure that the connection is always live and does not
+         * dead without notifying the bot. this value should not be changed.
+         * The option is a <code>long</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointProducerBuilder reconnectIdleConnectionTimeout(
+                long reconnectIdleConnectionTimeout) {
+            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+            return this;
+        }
+        /**
+         * The timeout in millisecond to reconnect the existing getMessage
+         * connection to ensure that the connection is always live and does not
+         * dead without notifying the bot. this value should not be changed.
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointProducerBuilder reconnectIdleConnectionTimeout(
+                String reconnectIdleConnectionTimeout) {
+            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+            return this;
+        }
+        /**
          * Coefficient to compute back off time when using Exponential Back Off
          * strategy.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder retryExponentialCoefficient(
-                Long retryExponentialCoefficient) {
+                long retryExponentialCoefficient) {
             setProperty("retryExponentialCoefficient", retryExponentialCoefficient);
             return this;
         }
         /**
          * Coefficient to compute back off time when using Exponential Back Off
          * strategy.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder retryExponentialCoefficient(
                 String retryExponentialCoefficient) {
@@ -857,19 +774,19 @@ public interface SoroushBotEndpointBuilderFactory {
         /**
          * The amount of time (in millisecond) which adds to waiting time when
          * using Linear back off strategy.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder retryLinearIncrement(
-                Long retryLinearIncrement) {
+                long retryLinearIncrement) {
             setProperty("retryLinearIncrement", retryLinearIncrement);
             return this;
         }
         /**
          * The amount of time (in millisecond) which adds to waiting time when
          * using Linear back off strategy.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder retryLinearIncrement(
                 String retryLinearIncrement) {
@@ -881,11 +798,11 @@ public interface SoroushBotEndpointBuilderFactory {
          * backOffStrategy is not Fixed this is the based value for computing
          * back off waiting time. the first retry is always happen immediately
          * after failure and retryWaitingTime do not apply to the first retry.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder retryWaitingTime(
-                Long retryWaitingTime) {
+                long retryWaitingTime) {
             setProperty("retryWaitingTime", retryWaitingTime);
             return this;
         }
@@ -894,78 +811,14 @@ public interface SoroushBotEndpointBuilderFactory {
          * backOffStrategy is not Fixed this is the based value for computing
          * back off waiting time. the first retry is always happen immediately
          * after failure and retryWaitingTime do not apply to the first retry.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointProducerBuilder retryWaitingTime(
                 String retryWaitingTime) {
             setProperty("retryWaitingTime", retryWaitingTime);
             return this;
         }
-        /**
-         * The authorization token for using the bot. if uri path does not
-         * contain authorization token, this token will be used.
-         * The option is a <code>java.lang.String</code> type.
-         * @group security
-         */
-        default SoroushBotEndpointProducerBuilder authorizationToken(
-                String authorizationToken) {
-            setProperty("authorizationToken", authorizationToken);
-            return this;
-        }
-        /**
-         * Automatically upload attachments when a message goes to the
-         * sendMessage endpoint and the SoroushMessage.file
-         * (SoroushMessage.thumbnail) has been set and
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group sendMessage
-         */
-        default SoroushBotEndpointProducerBuilder autoUploadFile(
-                Boolean autoUploadFile) {
-            setProperty("autoUploadFile", autoUploadFile);
-            return this;
-        }
-        /**
-         * Automatically upload attachments when a message goes to the
-         * sendMessage endpoint and the SoroushMessage.file
-         * (SoroushMessage.thumbnail) has been set and
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group sendMessage
-         */
-        default SoroushBotEndpointProducerBuilder autoUploadFile(
-                String autoUploadFile) {
-            setProperty("autoUploadFile", autoUploadFile);
-            return this;
-        }
-        /**
-         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
-         * exists, even if the
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
-         * the message.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group uploadFile
-         */
-        default SoroushBotEndpointProducerBuilder forceUpload(
-                Boolean forceUpload) {
-            setProperty("forceUpload", forceUpload);
-            return this;
-        }
-        /**
-         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
-         * exists, even if the
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
-         * the message.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group uploadFile
-         */
-        default SoroushBotEndpointProducerBuilder forceUpload(String forceUpload) {
-            setProperty("forceUpload", forceUpload);
-            return this;
-        }
     }
 
     /**
@@ -1033,153 +886,39 @@ public interface SoroushBotEndpointBuilderFactory {
             return (AdvancedSoroushBotEndpointBuilder) this;
         }
         /**
-         * The endpoint type. Support getMessage as consumer and
-         * sendMessage,uploadFile,downloadFile as producer.
+         * The action to do.
          * The option is a
-         * <code>org.apache.camel.component.soroushbot.models.Endpoint</code>
-         * type.
+         * <code>org.apache.camel.component.soroushbot.models.SoroushAction</code> type.
          * @group common
          */
-        default SoroushBotEndpointBuilder endpoint(Endpoint endpoint) {
-            setProperty("endpoint", endpoint);
+        default SoroushBotEndpointBuilder action(SoroushAction action) {
+            setProperty("action", action);
             return this;
         }
         /**
-         * The endpoint type. Support getMessage as consumer and
-         * sendMessage,uploadFile,downloadFile as producer.
+         * The action to do.
          * The option will be converted to a
-         * <code>org.apache.camel.component.soroushbot.models.Endpoint</code>
-         * type.
+         * <code>org.apache.camel.component.soroushbot.models.SoroushAction</code> type.
          * @group common
          */
-        default SoroushBotEndpointBuilder endpoint(String endpoint) {
-            setProperty("endpoint", endpoint);
-            return this;
-        }
-        /**
-         * Automatically download SoroushMessage.fileUrl and
-         * SoroushMessage.thumbnailUrl if exists for the message and store them
-         * in SoroushMessage.file and SoroushMessage.thumbnail field.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointBuilder autoDownload(Boolean autoDownload) {
-            setProperty("autoDownload", autoDownload);
-            return this;
-        }
-        /**
-         * Automatically download SoroushMessage.fileUrl and
-         * SoroushMessage.thumbnailUrl if exists for the message and store them
-         * in SoroushMessage.file and SoroushMessage.thumbnail field.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointBuilder autoDownload(String autoDownload) {
-            setProperty("autoDownload", autoDownload);
-            return this;
-        }
-        /**
-         * The timeout in millisecond to reconnect the existing getMessage
-         * connection to ensure that the connection is always live and does not
-         * dead without notifying the bot. this value should not be changed.
-         * The option is a <code>long</code> type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointBuilder reconnectIdleConnectionTimeout(
-                long reconnectIdleConnectionTimeout) {
-            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
-            return this;
-        }
-        /**
-         * The timeout in millisecond to reconnect the existing getMessage
-         * connection to ensure that the connection is always live and does not
-         * dead without notifying the bot. this value should not be changed.
-         * The option will be converted to a <code>long</code> type.
-         * @group getMessage
-         */
-        default SoroushBotEndpointBuilder reconnectIdleConnectionTimeout(
-                String reconnectIdleConnectionTimeout) {
-            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
-            return this;
-        }
-        /**
-         * If true, when downloading an attached file, thumbnail will be
-         * downloaded if provided in the message. Otherwise, only the file will
-         * be downloaded.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group downloadFile
-         */
-        default SoroushBotEndpointBuilder downloadThumbnail(
-                Boolean downloadThumbnail) {
-            setProperty("downloadThumbnail", downloadThumbnail);
-            return this;
-        }
-        /**
-         * If true, when downloading an attached file, thumbnail will be
-         * downloaded if provided in the message. Otherwise, only the file will
-         * be downloaded.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group downloadFile
-         */
-        default SoroushBotEndpointBuilder downloadThumbnail(
-                String downloadThumbnail) {
-            setProperty("downloadThumbnail", downloadThumbnail);
-            return this;
-        }
-        /**
-         * Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl)
-         * if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail)
-         * was not null in that message.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group downloadFile
-         */
-        default SoroushBotEndpointBuilder forceDownload(Boolean forceDownload) {
-            setProperty("forceDownload", forceDownload);
-            return this;
-        }
-        /**
-         * Force to download SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl)
-         * if exists, even if the SoroushMessage.file(SoroushMessage.thumbnail)
-         * was not null in that message.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group downloadFile
-         */
-        default SoroushBotEndpointBuilder forceDownload(String forceDownload) {
-            setProperty("forceDownload", forceDownload);
-            return this;
-        }
-        /**
-         * The strategy to backoff in case of connection failure. Currently 3
-         * strategies are supported: 1. Exponential (default): It multiply
-         * retryWaitingTime by retryExponentialCoefficient after each connection
-         * failure. 2. Linear: It increase retryWaitingTime by
-         * retryLinearIncrement after each connection failure. 3. Fixed: Always
-         * use retryWaitingTime as the time between retries.
-         * The option is a <code>java.lang.String</code> type.
-         * @group global
-         */
-        default SoroushBotEndpointBuilder backOffStrategy(String backOffStrategy) {
-            setProperty("backOffStrategy", backOffStrategy);
+        default SoroushBotEndpointBuilder action(String action) {
+            setProperty("action", action);
             return this;
         }
         /**
          * Connection timeout in ms when connecting to soroush API.
-         * The option is a <code>java.lang.Integer</code> type.
-         * @group global
+         * The option is a <code>int</code> type.
+         * @group common
          */
         default SoroushBotEndpointBuilder connectionTimeout(
-                Integer connectionTimeout) {
+                int connectionTimeout) {
             setProperty("connectionTimeout", connectionTimeout);
             return this;
         }
         /**
          * Connection timeout in ms when connecting to soroush API.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
-         * @group global
+         * The option will be converted to a <code>int</code> type.
+         * @group common
          */
         default SoroushBotEndpointBuilder connectionTimeout(
                 String connectionTimeout) {
@@ -1190,11 +929,11 @@ public interface SoroushBotEndpointBuilderFactory {
          * Maximum connection retry when fail to connect to soroush API, if the
          * quota is reached, MaximumConnectionRetryReachedException is thrown
          * for that message.
-         * The option is a <code>java.lang.Integer</code> type.
-         * @group global
+         * The option is a <code>int</code> type.
+         * @group common
          */
         default SoroushBotEndpointBuilder maxConnectionRetry(
-                Integer maxConnectionRetry) {
+                int maxConnectionRetry) {
             setProperty("maxConnectionRetry", maxConnectionRetry);
             return this;
         }
@@ -1202,9 +941,8 @@ public interface SoroushBotEndpointBuilderFactory {
          * Maximum connection retry when fail to connect to soroush API, if the
          * quota is reached, MaximumConnectionRetryReachedException is thrown
          * for that message.
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
-         * @group global
+         * The option will be converted to a <code>int</code> type.
+         * @group common
          */
         default SoroushBotEndpointBuilder maxConnectionRetry(
                 String maxConnectionRetry) {
@@ -1212,21 +950,46 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
+         * The authorization token for using the bot. if uri path does not
+         * contain authorization token, this token will be used.
+         * The option is a <code>java.lang.String</code> type.
+         * @group security
+         */
+        default SoroushBotEndpointBuilder authorizationToken(
+                String authorizationToken) {
+            setProperty("authorizationToken", authorizationToken);
+            return this;
+        }
+        /**
+         * The strategy to backoff in case of connection failure. Currently 3
+         * strategies are supported: 1. Exponential (default): It multiply
+         * retryWaitingTime by retryExponentialCoefficient after each connection
+         * failure. 2. Linear: It increase retryWaitingTime by
+         * retryLinearIncrement after each connection failure. 3. Fixed: Always
+         * use retryWaitingTime as the time between retries.
+         * The option is a <code>java.lang.String</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointBuilder backOffStrategy(String backOffStrategy) {
+            setProperty("backOffStrategy", backOffStrategy);
+            return this;
+        }
+        /**
          * Maximum amount of time (in millisecond) a thread wait before retrying
          * failed request.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointBuilder maxRetryWaitingTime(
-                Long maxRetryWaitingTime) {
+                long maxRetryWaitingTime) {
             setProperty("maxRetryWaitingTime", maxRetryWaitingTime);
             return this;
         }
         /**
          * Maximum amount of time (in millisecond) a thread wait before retrying
          * failed request.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointBuilder maxRetryWaitingTime(
                 String maxRetryWaitingTime) {
@@ -1234,21 +997,45 @@ public interface SoroushBotEndpointBuilderFactory {
             return this;
         }
         /**
+         * The timeout in millisecond to reconnect the existing getMessage
+         * connection to ensure that the connection is always live and does not
+         * dead without notifying the bot. this value should not be changed.
+         * The option is a <code>long</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointBuilder reconnectIdleConnectionTimeout(
+                long reconnectIdleConnectionTimeout) {
+            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+            return this;
+        }
+        /**
+         * The timeout in millisecond to reconnect the existing getMessage
+         * connection to ensure that the connection is always live and does not
+         * dead without notifying the bot. this value should not be changed.
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
+         */
+        default SoroushBotEndpointBuilder reconnectIdleConnectionTimeout(
+                String reconnectIdleConnectionTimeout) {
+            setProperty("reconnectIdleConnectionTimeout", reconnectIdleConnectionTimeout);
+            return this;
+        }
+        /**
          * Coefficient to compute back off time when using Exponential Back Off
          * strategy.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointBuilder retryExponentialCoefficient(
-                Long retryExponentialCoefficient) {
+                long retryExponentialCoefficient) {
             setProperty("retryExponentialCoefficient", retryExponentialCoefficient);
             return this;
         }
         /**
          * Coefficient to compute back off time when using Exponential Back Off
          * strategy.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointBuilder retryExponentialCoefficient(
                 String retryExponentialCoefficient) {
@@ -1258,19 +1045,19 @@ public interface SoroushBotEndpointBuilderFactory {
         /**
          * The amount of time (in millisecond) which adds to waiting time when
          * using Linear back off strategy.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointBuilder retryLinearIncrement(
-                Long retryLinearIncrement) {
+                long retryLinearIncrement) {
             setProperty("retryLinearIncrement", retryLinearIncrement);
             return this;
         }
         /**
          * The amount of time (in millisecond) which adds to waiting time when
          * using Linear back off strategy.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointBuilder retryLinearIncrement(
                 String retryLinearIncrement) {
@@ -1282,10 +1069,10 @@ public interface SoroushBotEndpointBuilderFactory {
          * backOffStrategy is not Fixed this is the based value for computing
          * back off waiting time. the first retry is always happen immediately
          * after failure and retryWaitingTime do not apply to the first retry.
-         * The option is a <code>java.lang.Long</code> type.
-         * @group global
+         * The option is a <code>long</code> type.
+         * @group scheduling
          */
-        default SoroushBotEndpointBuilder retryWaitingTime(Long retryWaitingTime) {
+        default SoroushBotEndpointBuilder retryWaitingTime(long retryWaitingTime) {
             setProperty("retryWaitingTime", retryWaitingTime);
             return this;
         }
@@ -1294,75 +1081,14 @@ public interface SoroushBotEndpointBuilderFactory {
          * backOffStrategy is not Fixed this is the based value for computing
          * back off waiting time. the first retry is always happen immediately
          * after failure and retryWaitingTime do not apply to the first retry.
-         * The option will be converted to a <code>java.lang.Long</code> type.
-         * @group global
+         * The option will be converted to a <code>long</code> type.
+         * @group scheduling
          */
         default SoroushBotEndpointBuilder retryWaitingTime(
                 String retryWaitingTime) {
             setProperty("retryWaitingTime", retryWaitingTime);
             return this;
         }
-        /**
-         * The authorization token for using the bot. if uri path does not
-         * contain authorization token, this token will be used.
-         * The option is a <code>java.lang.String</code> type.
-         * @group security
-         */
-        default SoroushBotEndpointBuilder authorizationToken(
-                String authorizationToken) {
-            setProperty("authorizationToken", authorizationToken);
-            return this;
-        }
-        /**
-         * Automatically upload attachments when a message goes to the
-         * sendMessage endpoint and the SoroushMessage.file
-         * (SoroushMessage.thumbnail) has been set and
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group sendMessage
-         */
-        default SoroushBotEndpointBuilder autoUploadFile(Boolean autoUploadFile) {
-            setProperty("autoUploadFile", autoUploadFile);
-            return this;
-        }
-        /**
-         * Automatically upload attachments when a message goes to the
-         * sendMessage endpoint and the SoroushMessage.file
-         * (SoroushMessage.thumbnail) has been set and
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is null.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group sendMessage
-         */
-        default SoroushBotEndpointBuilder autoUploadFile(String autoUploadFile) {
-            setProperty("autoUploadFile", autoUploadFile);
-            return this;
-        }
-        /**
-         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
-         * exists, even if the
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
-         * the message.
-         * The option is a <code>java.lang.Boolean</code> type.
-         * @group uploadFile
-         */
-        default SoroushBotEndpointBuilder forceUpload(Boolean forceUpload) {
-            setProperty("forceUpload", forceUpload);
-            return this;
-        }
-        /**
-         * Force to upload SoroushMessage.file(SoroushMessage.thumbnail) if
-         * exists, even if the
-         * SoroushMessage.fileUrl(SoroushMessage.thumbnailUrl) is not null in
-         * the message.
-         * The option will be converted to a <code>java.lang.Boolean</code>
-         * type.
-         * @group uploadFile
-         */
-        default SoroushBotEndpointBuilder forceUpload(String forceUpload) {
-            setProperty("forceUpload", forceUpload);
-            return this;
-        }
     }
 
     /**
@@ -1421,9 +1147,10 @@ public interface SoroushBotEndpointBuilderFactory {
 
     /**
      * Proxy enum for
-     * <code>org.apache.camel.component.soroushbot.models.Endpoint</code> enum.
+     * <code>org.apache.camel.component.soroushbot.models.SoroushAction</code>
+     * enum.
      */
-    enum Endpoint {
+    enum SoroushAction {
         sendMessage,
         getMessage,
         uploadFile,