Add some assertions around correctness of the imput and fix some multi-threading potential issue
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7a136a01 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7a136a01 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7a136a01 Branch: refs/heads/master Commit: 7a136a0151d9412d3f793a0d40ea698f0aa6089f Parents: d661a7a Author: lburgazzoli <lburgazz...@gmail.com> Authored: Thu Apr 13 13:34:21 2017 +0200 Committer: lburgazzoli <lburgazz...@gmail.com> Committed: Thu Apr 13 13:35:41 2017 +0200 ---------------------------------------------------------------------- .../camel/impl/cloud/RandomServiceChooser.java | 26 +++++++++++--------- .../impl/cloud/RoundRobinServiceChooser.java | 15 ++++++++--- 2 files changed, 25 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/7a136a01/camel-core/src/main/java/org/apache/camel/impl/cloud/RandomServiceChooser.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/cloud/RandomServiceChooser.java b/camel-core/src/main/java/org/apache/camel/impl/cloud/RandomServiceChooser.java index 4117769..2b6c8d4 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/cloud/RandomServiceChooser.java +++ b/camel-core/src/main/java/org/apache/camel/impl/cloud/RandomServiceChooser.java @@ -17,28 +17,30 @@ package org.apache.camel.impl.cloud; import java.util.List; -import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; import org.apache.camel.cloud.ServiceChooser; import org.apache.camel.cloud.ServiceDefinition; +import org.apache.camel.util.ObjectHelper; public class RandomServiceChooser implements ServiceChooser { - private final Random random; - - public RandomServiceChooser() { - this.random = new Random(); - } - @Override - public ServiceDefinition choose(List<ServiceDefinition> servers) { - int size = servers.size(); - int index = (size > 1) ? random.nextInt(size) : 0; + public ServiceDefinition choose(List<ServiceDefinition> definitions) { + // Fail if the service definition list is null or empty + if (ObjectHelper.isEmpty(definitions)) { + throw new IllegalArgumentException("The ServiceDefinition list should not be empty"); + } - return servers.get(index); + int size = definitions.size(); + if (size == 1) { + return definitions.get(0); + } else { + return definitions.get(ThreadLocalRandom.current().nextInt(size)); + } } @Override public String toString() { - return "RandomServiceCallServiceChooser"; + return "RandomServiceChooser"; } } http://git-wip-us.apache.org/repos/asf/camel/blob/7a136a01/camel-core/src/main/java/org/apache/camel/impl/cloud/RoundRobinServiceChooser.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/impl/cloud/RoundRobinServiceChooser.java b/camel-core/src/main/java/org/apache/camel/impl/cloud/RoundRobinServiceChooser.java index e5ef1b5..369c3c0 100644 --- a/camel-core/src/main/java/org/apache/camel/impl/cloud/RoundRobinServiceChooser.java +++ b/camel-core/src/main/java/org/apache/camel/impl/cloud/RoundRobinServiceChooser.java @@ -20,21 +20,28 @@ import java.util.List; import org.apache.camel.cloud.ServiceChooser; import org.apache.camel.cloud.ServiceDefinition; +import org.apache.camel.util.ObjectHelper; public class RoundRobinServiceChooser implements ServiceChooser { private int counter = -1; @Override - public ServiceDefinition choose(List<ServiceDefinition> servers) { - int size = servers.size(); + public synchronized ServiceDefinition choose(List<ServiceDefinition> definitions) { + // Fail if the service definition list is null or empty + if (ObjectHelper.isEmpty(definitions)) { + throw new IllegalArgumentException("The ServiceDefinition list should not be empty"); + } + + int size = definitions.size(); if (size == 1 || ++counter >= size) { counter = 0; } - return servers.get(counter); + + return definitions.get(counter); } @Override public String toString() { - return "RoundRobinServiceCallServiceChooser"; + return "RoundRobinServiceChooser"; } }