You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2021/11/09 10:24:13 UTC

[camel] 01/02: CAMEL-17121: added support for configuring the back-off strategy

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

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

commit 464acde20df180c8bbd8b536afb90c9cfdc4dfcd
Author: Otavio Rodolfo Piske <op...@redhat.com>
AuthorDate: Mon Nov 8 15:42:42 2021 +0100

    CAMEL-17121: added support for configuring the back-off strategy
---
 .../org/apache/camel/support/task/ForegroundTask.java |  4 ++--
 .../support/task/budget/IterationBoundedBudget.java   | 17 +++++++++++++----
 .../task/budget/IterationBoundedBudgetBuilder.java    | 15 ++++++++++++++-
 .../camel/support/task/budget/IterationBudget.java    |  2 +-
 .../task/budget/IterationTimeBoundedBudget.java       |  2 +-
 .../support/task/budget/backoff}/BackOffStrategy.java | 15 +++++++++++++--
 .../task/budget/backoff/FixedBackOffStrategy.java     | 19 ++++++++++++++++---
 .../apache/camel/support/task/TaskTestSupport.java    |  1 -
 8 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/core/camel-support/src/main/java/org/apache/camel/support/task/ForegroundTask.java b/core/camel-support/src/main/java/org/apache/camel/support/task/ForegroundTask.java
index f7edb36..5b1935b 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/task/ForegroundTask.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/task/ForegroundTask.java
@@ -74,7 +74,7 @@ public class ForegroundTask implements BlockingTask {
             while (budget.next()) {
                 if (predicate.test(payload)) {
                     LOG.info("Task {} is complete after {} iterations and it is ready to continue",
-                            name, budget.iterations());
+                            name, budget.iteration());
                     completed = true;
                     break;
                 }
@@ -103,7 +103,7 @@ public class ForegroundTask implements BlockingTask {
             while (budget.next()) {
                 if (supplier.getAsBoolean()) {
                     LOG.info("Task {} is complete after {} iterations and it is ready to continue",
-                            name, budget.iterations());
+                            name, budget.iteration());
                     completed = true;
 
                     break;
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudget.java b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudget.java
index 1225846..6cf3574 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudget.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudget.java
@@ -17,18 +17,27 @@
 
 package org.apache.camel.support.task.budget;
 
+import org.apache.camel.support.task.budget.backoff.BackOffStrategy;
+import org.apache.camel.support.task.budget.backoff.FixedBackOffStrategy;
+
 public class IterationBoundedBudget implements IterationBudget {
     public static final int UNLIMITED_ITERATIONS = -1;
 
     private final long initialDelay;
-    private final long interval;
     private final int maxIterations;
+    private final BackOffStrategy backOffStrategy;
     private int iterations;
 
     IterationBoundedBudget(long initialDelay, long interval, int maxIterations) {
         this.initialDelay = initialDelay;
-        this.interval = interval;
         this.maxIterations = maxIterations;
+        this.backOffStrategy = new FixedBackOffStrategy(interval);
+    }
+
+    IterationBoundedBudget(long initialDelay, int maxIterations, BackOffStrategy backOffStrategy) {
+        this.initialDelay = initialDelay;
+        this.maxIterations = maxIterations;
+        this.backOffStrategy = backOffStrategy;
     }
 
     @Override
@@ -38,7 +47,7 @@ public class IterationBoundedBudget implements IterationBudget {
 
     @Override
     public long interval() {
-        return interval;
+        return backOffStrategy.calculateInterval(iterations);
     }
 
     @Override
@@ -46,7 +55,7 @@ public class IterationBoundedBudget implements IterationBudget {
         return maxIterations;
     }
 
-    public int iterations() {
+    public int iteration() {
         return iterations;
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudgetBuilder.java b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudgetBuilder.java
index 4770b29..e410bbe 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudgetBuilder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBoundedBudgetBuilder.java
@@ -19,6 +19,8 @@ package org.apache.camel.support.task.budget;
 
 import java.time.Duration;
 
+import org.apache.camel.support.task.budget.backoff.BackOffStrategy;
+
 /**
  * A helper builder of iteration bounded builders. Provide generic/safe default values, but should be adjusted on a
  * per-case basis. By default, execute the iterations for up to Integer.MAX_VALUE.
@@ -31,6 +33,7 @@ public class IterationBoundedBudgetBuilder implements BudgetBuilder<IterationBud
     protected long initialDelay = DEFAULT_INITIAL_DELAY;
     protected long interval = DEFAULT_INTERVAL;
     protected int maxIterations = DEFAULT_MAX_ITERATIONS;
+    protected BackOffStrategy backOffStrategy;
 
     public IterationBoundedBudgetBuilder withInitialDelay(Duration duration) {
         this.initialDelay = duration.toMillis();
@@ -50,8 +53,18 @@ public class IterationBoundedBudgetBuilder implements BudgetBuilder<IterationBud
         return this;
     }
 
+    public IterationBoundedBudgetBuilder withBackOffStrategy(BackOffStrategy backOffStrategy) {
+        this.backOffStrategy = backOffStrategy;
+
+        return this;
+    }
+
     @Override
     public IterationBoundedBudget build() {
-        return new IterationBoundedBudget(initialDelay, interval, maxIterations);
+        if (backOffStrategy == null) {
+            return new IterationBoundedBudget(initialDelay, interval, maxIterations);
+        }
+
+        return new IterationBoundedBudget(initialDelay, maxIterations, backOffStrategy);
     }
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBudget.java b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBudget.java
index bab5111..497e8af 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBudget.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationBudget.java
@@ -34,5 +34,5 @@ public interface IterationBudget extends Budget {
      * 
      * @return the current number of iterations
      */
-    int iterations();
+    int iteration();
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationTimeBoundedBudget.java b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationTimeBoundedBudget.java
index 5c95986..702bc28 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationTimeBoundedBudget.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/IterationTimeBoundedBudget.java
@@ -42,7 +42,7 @@ public class IterationTimeBoundedBudget implements IterationBudget, TimeBudget {
     }
 
     @Override
-    public int iterations() {
+    public int iteration() {
         return iterationBudget.maxIterations();
     }
 
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/BackOffStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/backoff/BackOffStrategy.java
similarity index 68%
copy from components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/BackOffStrategy.java
copy to core/camel-support/src/main/java/org/apache/camel/support/task/budget/backoff/BackOffStrategy.java
index f531719..e8df94c 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/BackOffStrategy.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/backoff/BackOffStrategy.java
@@ -14,8 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.soroushbot.utils;
 
+package org.apache.camel.support.task.budget.backoff;
+
+/**
+ * A back-off strategy is used to configure different strategies for calculating the interval time between iterations
+ */
 public interface BackOffStrategy {
-    void waitBeforeRetry(int retryCount) throws InterruptedException;
+
+    /**
+     * Calculates the back-off interval
+     *
+     * @param  iteration the current iteration count
+     * @return           the interval in milliseconds
+     */
+    long calculateInterval(int iteration);
 }
diff --git a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/BackOffStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/backoff/FixedBackOffStrategy.java
similarity index 67%
rename from components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/BackOffStrategy.java
rename to core/camel-support/src/main/java/org/apache/camel/support/task/budget/backoff/FixedBackOffStrategy.java
index f531719..a059277 100644
--- a/components/camel-soroush/src/main/java/org/apache/camel/component/soroushbot/utils/BackOffStrategy.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/task/budget/backoff/FixedBackOffStrategy.java
@@ -14,8 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.soroushbot.utils;
 
-public interface BackOffStrategy {
-    void waitBeforeRetry(int retryCount) throws InterruptedException;
+package org.apache.camel.support.task.budget.backoff;
+
+/**
+ * A back-off strategy with constant rate
+ */
+public class FixedBackOffStrategy implements BackOffStrategy {
+    private final long interval;
+
+    public FixedBackOffStrategy(long interval) {
+        this.interval = interval;
+    }
+
+    @Override
+    public long calculateInterval(int iteration) {
+        return interval;
+    }
 }
diff --git a/core/camel-support/src/test/java/org/apache/camel/support/task/TaskTestSupport.java b/core/camel-support/src/test/java/org/apache/camel/support/task/TaskTestSupport.java
index 7396a95..b51e98a 100644
--- a/core/camel-support/src/test/java/org/apache/camel/support/task/TaskTestSupport.java
+++ b/core/camel-support/src/test/java/org/apache/camel/support/task/TaskTestSupport.java
@@ -55,7 +55,6 @@ public class TaskTestSupport {
         try {
             Thread.sleep(2000);
         } catch (InterruptedException e) {
-            System.out.println("Interrupted");
             return false;
         }