You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/04/19 16:16:01 UTC
[2/4] camel git commit: Rename LoadBalancer to ServiceLoadBalancer to
avoid confusion with LoadBalancer processor
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
new file mode 100644
index 0000000..5c25f10
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/model/cloud/ServiceCallServiceLoadBalancerConfiguration.java
@@ -0,0 +1,189 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.model.cloud;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.NoFactoryAvailableException;
+import org.apache.camel.cloud.ServiceLoadBalancer;
+import org.apache.camel.cloud.ServiceLoadBalancerFactory;
+import org.apache.camel.model.IdentifiedType;
+import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.PropertyDefinition;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.CamelContextHelper;
+import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.util.ObjectHelper;
+
+@Metadata(label = "routing,cloud,load-balancing")
+@XmlRootElement(name = "loadBalancerConfiguration")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ServiceCallServiceLoadBalancerConfiguration extends IdentifiedType implements ServiceLoadBalancerFactory {
+ private static final String RESOURCE_PATH = "META-INF/services/org/apache/camel/cloud/";
+
+ @XmlTransient
+ private final ServiceCallDefinition parent;
+ @XmlTransient
+ private final String factoryKey;
+ @XmlElement(name = "properties") @Metadata(label = "advanced")
+ private List<PropertyDefinition> properties;
+
+ public ServiceCallServiceLoadBalancerConfiguration() {
+ this(null, null);
+ }
+
+ public ServiceCallServiceLoadBalancerConfiguration(ServiceCallDefinition parent, String factoryKey) {
+ this.parent = parent;
+ this.factoryKey = factoryKey;
+ }
+
+ public ServiceCallDefinition end() {
+ return this.parent;
+ }
+
+ public ProcessorDefinition<?> endParent() {
+ return this.parent.end();
+ }
+
+ // *************************************************************************
+ //
+ // *************************************************************************
+
+ public List<PropertyDefinition> getProperties() {
+ return properties;
+ }
+
+ /**
+ * Set client properties to use.
+ * <p/>
+ * These properties are specific to what service call implementation are in
+ * use. For example if using ribbon, then the client properties are define
+ * in com.netflix.client.config.CommonClientConfigKey.
+ */
+ public void setProperties(List<PropertyDefinition> properties) {
+ this.properties = properties;
+ }
+
+ /**
+ * Adds a custom property to use.
+ * <p/>
+ * These properties are specific to what service call implementation are in
+ * use. For example if using ribbon, then the client properties are define
+ * in com.netflix.client.config.CommonClientConfigKey.
+ */
+ public ServiceCallServiceLoadBalancerConfiguration property(String key, String value) {
+ if (properties == null) {
+ properties = new ArrayList<>();
+ }
+ PropertyDefinition prop = new PropertyDefinition();
+ prop.setKey(key);
+ prop.setValue(value);
+ properties.add(prop);
+ return this;
+ }
+
+ protected Map<String, String> getPropertiesAsMap(CamelContext camelContext) throws Exception {
+ Map<String, String> answer;
+
+ if (properties == null || properties.isEmpty()) {
+ answer = Collections.emptyMap();
+ } else {
+ answer = new HashMap<>();
+ for (PropertyDefinition prop : properties) {
+ // support property placeholders
+ String key = CamelContextHelper.parseText(camelContext, prop.getKey());
+ String value = CamelContextHelper.parseText(camelContext, prop.getValue());
+ answer.put(key, value);
+ }
+ }
+
+ return answer;
+ }
+
+ // *************************************************************************
+ // Factory
+ // *************************************************************************
+
+ @Override
+ public ServiceLoadBalancer newInstance(CamelContext camelContext) throws Exception {
+ ObjectHelper.notNull(factoryKey, "LoadBalancer factoryKey");
+
+ ServiceLoadBalancer answer;
+
+ // First try to find the factory from the registry.
+ ServiceLoadBalancerFactory factory = CamelContextHelper.lookup(camelContext, factoryKey, ServiceLoadBalancerFactory.class);
+ if (factory != null) {
+ // If a factory is found in the registry do not re-configure it as
+ // it should be pre-configured.
+ answer = factory.newInstance(camelContext);
+ } else {
+
+ Class<?> type;
+ try {
+ // Then use Service factory.
+ type = camelContext.getFactoryFinder(RESOURCE_PATH).findClass(factoryKey);
+ } catch (Exception e) {
+ throw new NoFactoryAvailableException(RESOURCE_PATH + factoryKey, e);
+ }
+
+ if (type != null) {
+ if (ServiceLoadBalancerFactory.class.isAssignableFrom(type)) {
+ factory = (ServiceLoadBalancerFactory) camelContext.getInjector().newInstance(type);
+ } else {
+ throw new IllegalArgumentException(
+ "Resolving LoadBalancer: " + factoryKey + " detected type conflict: Not a LoadBalancerFactory implementation. Found: " + type.getName());
+ }
+ }
+
+ try {
+ Map<String, Object> parameters = new HashMap<>();
+ IntrospectionSupport.getProperties(this, parameters, null, false);
+
+ // Convert properties to Map<String, String>
+ parameters.put("properties", getPropertiesAsMap(camelContext));
+
+ postProcessFactoryParameters(camelContext, parameters);
+
+ IntrospectionSupport.setProperties(factory, parameters);
+
+ answer = factory.newInstance(camelContext);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ return answer;
+ }
+
+ // *************************************************************************
+ // Utilities
+ // *************************************************************************
+
+ protected void postProcessFactoryParameters(CamelContext camelContext, Map<String, Object> parameters) throws Exception {
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-load-balancer
----------------------------------------------------------------------
diff --git a/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-load-balancer b/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-load-balancer
deleted file mode 100644
index f8c9ddb..0000000
--- a/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-load-balancer
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-class=org.apache.camel.impl.cloud.DefaultLoadBalancerFactory
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-service-load-balancer
----------------------------------------------------------------------
diff --git a/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-service-load-balancer b/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-service-load-balancer
new file mode 100644
index 0000000..16644c8
--- /dev/null
+++ b/camel-core/src/main/resources/META-INF/services/org/apache/camel/cloud/default-service-load-balancer
@@ -0,0 +1,17 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+class=org.apache.camel.impl.cloud.DefaultServiceLoadBalancerFactory
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/camel-core/src/main/resources/org/apache/camel/model/cloud/jaxb.index
----------------------------------------------------------------------
diff --git a/camel-core/src/main/resources/org/apache/camel/model/cloud/jaxb.index b/camel-core/src/main/resources/org/apache/camel/model/cloud/jaxb.index
index 5f5af59..fb41af7 100644
--- a/camel-core/src/main/resources/org/apache/camel/model/cloud/jaxb.index
+++ b/camel-core/src/main/resources/org/apache/camel/model/cloud/jaxb.index
@@ -19,7 +19,7 @@ ServiceCallConfigurationDefinition
ServiceCallServiceDiscoveryConfiguration
ServiceCallServiceFilterConfiguration
ServiceCallServiceChooserConfiguration
-ServiceCallLoadBalancerConfiguration
+ServiceCallServiceLoadBalancerConfiguration
BlacklistServiceCallServiceFilterConfiguration
ChainedServiceCallServiceFilterConfiguration
PassThroughServiceCallServiceFilterConfiguration
@@ -31,4 +31,5 @@ HealthyServiceCallServiceFilterConfiguration
KubernetesServiceCallServiceDiscoveryConfiguration
AggregatingServiceCallServiceDiscoveryConfiguration
StaticServiceCallServiceDiscoveryConfiguration
-RibbonServiceCallLoadBalancerConfiguration
+DefaultServiceCallServiceLoadBalancerConfiguration
+RibbonServiceCallServiceLoadBalancerConfiguration
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/camel-core/src/test/java/org/apache/camel/impl/cloud/LoadBalancerTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/impl/cloud/LoadBalancerTest.java b/camel-core/src/test/java/org/apache/camel/impl/cloud/LoadBalancerTest.java
index 5e17bfb..a78c291 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/cloud/LoadBalancerTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/cloud/LoadBalancerTest.java
@@ -30,7 +30,7 @@ public class LoadBalancerTest extends ContextTestSupport {
serviceDiscovery.addServer("no-name", "127.0.0.1", 1001);
serviceDiscovery.addServer("no-name", "127.0.0.1", 1002);
- DefaultLoadBalancer loadBalancer = new DefaultLoadBalancer();
+ DefaultServiceLoadBalancer loadBalancer = new DefaultServiceLoadBalancer();
loadBalancer.setCamelContext(context);
loadBalancer.setServiceDiscovery(serviceDiscovery);
loadBalancer.setServiceFilter(services -> services.stream().filter(s -> s.getPort() < 2000).collect(Collectors.toList()));
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java b/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
index e193c6e..155bcc0 100644
--- a/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
+++ b/camel-core/src/test/java/org/apache/camel/impl/cloud/ServiceCallConfigurationTest.java
@@ -68,9 +68,9 @@ public class ServiceCallConfigurationTest {
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
- Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultLoadBalancer);
+ Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
- DefaultLoadBalancer loadBalancer = (DefaultLoadBalancer)proc.getLoadBalancer();
+ DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
Assert.assertEquals(sd, loadBalancer.getServiceDiscovery());
Assert.assertEquals(sf, loadBalancer.getServiceFilter());
@@ -111,9 +111,9 @@ public class ServiceCallConfigurationTest {
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
- Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultLoadBalancer);
+ Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
- DefaultLoadBalancer loadBalancer = (DefaultLoadBalancer)proc.getLoadBalancer();
+ DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
Assert.assertEquals(sd, loadBalancer.getServiceDiscovery());
Assert.assertEquals(sf, loadBalancer.getServiceFilter());
@@ -155,9 +155,9 @@ public class ServiceCallConfigurationTest {
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
- Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultLoadBalancer);
+ Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
- DefaultLoadBalancer loadBalancer = (DefaultLoadBalancer)proc.getLoadBalancer();
+ DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer)proc.getLoadBalancer();
Assert.assertEquals(sd, loadBalancer.getServiceDiscovery());
Assert.assertEquals(sf, loadBalancer.getServiceFilter());
@@ -236,9 +236,9 @@ public class ServiceCallConfigurationTest {
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
- Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultLoadBalancer);
+ Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
- DefaultLoadBalancer loadBalancer = (DefaultLoadBalancer) proc.getLoadBalancer();
+ DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer) proc.getLoadBalancer();
Assert.assertEquals(defaultServiceDiscovery, loadBalancer.getServiceDiscovery());
Assert.assertEquals(defaultServiceFilter, loadBalancer.getServiceFilter());
}
@@ -248,9 +248,9 @@ public class ServiceCallConfigurationTest {
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("named"));
Assert.assertNotNull(proc);
- Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultLoadBalancer);
+ Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
- DefaultLoadBalancer loadBalancer = (DefaultLoadBalancer) proc.getLoadBalancer();
+ DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer) proc.getLoadBalancer();
Assert.assertEquals(defaultServiceDiscovery, loadBalancer.getServiceDiscovery());
Assert.assertEquals(namedServiceFilter, loadBalancer.getServiceFilter());
}
@@ -260,9 +260,9 @@ public class ServiceCallConfigurationTest {
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("local"));
Assert.assertNotNull(proc);
- Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultLoadBalancer);
+ Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
- DefaultLoadBalancer loadBalancer = (DefaultLoadBalancer) proc.getLoadBalancer();
+ DefaultServiceLoadBalancer loadBalancer = (DefaultServiceLoadBalancer) proc.getLoadBalancer();
Assert.assertEquals(localServiceDiscovery, loadBalancer.getServiceDiscovery());
Assert.assertEquals(namedServiceFilter, loadBalancer.getServiceFilter());
}
@@ -302,7 +302,7 @@ public class ServiceCallConfigurationTest {
DefaultServiceCallProcessor proc = findServiceCallProcessor(context.getRoute("default"));
Assert.assertNotNull(proc);
- Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultLoadBalancer);
+ Assert.assertTrue(proc.getLoadBalancer() instanceof DefaultServiceLoadBalancer);
Assert.assertEquals("service-name", proc.getName());
Assert.assertEquals("file", proc.getScheme());
Assert.assertEquals("direct:service-name", proc.getUri());
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.java b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.java
index 05b28d7..4627984 100644
--- a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.java
+++ b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.java
@@ -17,6 +17,12 @@
package org.apache.camel.component.consul.cloud;
+import java.util.List;
+
+import org.apache.camel.component.ribbon.cloud.RibbonServiceLoadBalancer;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
+import org.junit.Assert;
+import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@@ -25,4 +31,14 @@ public class SpringConsulDefaultServiceCallRouteTest extends SpringConsulService
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.xml");
}
+
+ @Test
+ public void testServiceCallConfiguration() throws Exception {
+ List<DefaultServiceCallProcessor> processors = findServiceCallProcessors();
+
+ Assert.assertFalse(processors.isEmpty());
+ Assert.assertEquals(2, processors.size());
+ Assert.assertFalse(processors.get(0).getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+ Assert.assertFalse(processors.get(1).getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.java b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.java
index f7a4448..13cd719 100644
--- a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.java
+++ b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.java
@@ -17,6 +17,12 @@
package org.apache.camel.component.consul.cloud;
+import java.util.List;
+
+import org.apache.camel.component.ribbon.cloud.RibbonServiceLoadBalancer;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
+import org.junit.Assert;
+import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@@ -25,4 +31,14 @@ public class SpringConsulExpressionServiceCallRouteTest extends SpringConsulServ
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.xml");
}
+
+ @Test
+ public void testServiceCallConfiguration() throws Exception {
+ List<DefaultServiceCallProcessor> processors = findServiceCallProcessors();
+
+ Assert.assertFalse(processors.isEmpty());
+ Assert.assertEquals(2, processors.size());
+ Assert.assertFalse(processors.get(0).getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+ Assert.assertFalse(processors.get(1).getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.java b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.java
index 70eebfb..f76e72e 100644
--- a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.java
+++ b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.java
@@ -17,6 +17,12 @@
package org.apache.camel.component.consul.cloud;
+import java.util.List;
+
+import org.apache.camel.component.ribbon.cloud.RibbonServiceLoadBalancer;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
+import org.junit.Assert;
+import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@@ -25,4 +31,14 @@ public class SpringConsulRibbonServiceCallRouteTest extends SpringConsulServiceC
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.xml");
}
+
+ @Test
+ public void testServiceCallConfiguration() throws Exception {
+ List<DefaultServiceCallProcessor> processors = findServiceCallProcessors();
+
+ Assert.assertFalse(processors.isEmpty());
+ Assert.assertEquals(2, processors.size());
+ Assert.assertTrue(processors.get(0).getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+ Assert.assertTrue(processors.get(1).getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulServiceCallRouteTest.java b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulServiceCallRouteTest.java
index ac10b06..335c61e 100644
--- a/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulServiceCallRouteTest.java
+++ b/components/camel-consul/src/test/java/org/apache/camel/component/consul/cloud/SpringConsulServiceCallRouteTest.java
@@ -17,6 +17,7 @@
package org.apache.camel.component.consul.cloud;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -24,7 +25,14 @@ import com.orbitz.consul.AgentClient;
import com.orbitz.consul.Consul;
import com.orbitz.consul.model.agent.ImmutableRegistration;
import com.orbitz.consul.model.agent.Registration;
+import org.apache.camel.Navigate;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
+import org.apache.camel.processor.ChoiceProcessor;
+import org.apache.camel.processor.FilterProcessor;
import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Assert;
import org.junit.Test;
public abstract class SpringConsulServiceCallRouteTest extends CamelSpringTestSupport {
@@ -105,4 +113,33 @@ public abstract class SpringConsulServiceCallRouteTest extends CamelSpringTestSu
assertMockEndpointsSatisfied();
}
+
+ // ************************************
+ // Helpers
+ // ************************************
+
+ protected List<DefaultServiceCallProcessor> findServiceCallProcessors() {
+ Route route = context().getRoute("scall");
+
+ Assert.assertNotNull("ServiceCall Route should be present", route);
+
+ return findServiceCallProcessors(new ArrayList<>(), route.navigate());
+ }
+
+ protected List<DefaultServiceCallProcessor> findServiceCallProcessors(List<DefaultServiceCallProcessor> processors, Navigate<Processor> navigate) {
+ for (Processor processor : navigate.next()) {
+ if (processor instanceof DefaultServiceCallProcessor) {
+ processors.add((DefaultServiceCallProcessor)processor);
+ }
+ if (processor instanceof ChoiceProcessor) {
+ for (FilterProcessor filter : ((ChoiceProcessor) processor).getFilters()) {
+ findServiceCallProcessors(processors, filter);
+ }
+ } else if (processor instanceof Navigate) {
+ return findServiceCallProcessors(processors, (Navigate<Processor>)processor);
+ }
+ }
+
+ return processors;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.xml b/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.xml
index f050001..5e8731e 100644
--- a/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.xml
+++ b/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulDefaultServiceCallRouteTest.xml
@@ -51,7 +51,7 @@
<!-- Routes -->
<!-- ************************************* -->
- <route>
+ <route id="scall">
<from uri="direct:start"/>
<choice>
<when>
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.xml b/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.xml
index 9b463f8..a31e545 100644
--- a/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.xml
+++ b/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulExpressionServiceCallRouteTest.xml
@@ -54,7 +54,7 @@
<!-- Routes -->
<!-- ************************************* -->
- <route>
+ <route id="scall">
<from uri="direct:start"/>
<choice>
<when>
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.xml b/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.xml
index 582ccee..5af397c 100644
--- a/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.xml
+++ b/components/camel-consul/src/test/resources/org/apache/camel/component/consul/cloud/SpringConsulRibbonServiceCallRouteTest.xml
@@ -51,7 +51,7 @@
<!-- Routes -->
<!-- ************************************* -->
- <route>
+ <route id="scall">
<from uri="direct:start"/>
<choice>
<when>
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdConfiguration.java b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdConfiguration.java
index e784fa5..b8e7c81 100644
--- a/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdConfiguration.java
+++ b/components/camel-etcd/src/main/java/org/apache/camel/component/etcd/EtcdConfiguration.java
@@ -16,6 +16,9 @@
*/
package org.apache.camel.component.etcd;
+import mousio.etcd4j.EtcdClient;
+import mousio.etcd4j.EtcdSecurityContext;
+
import org.apache.camel.CamelContext;
import org.apache.camel.CamelContextAware;
import org.apache.camel.RuntimeCamelException;
@@ -23,9 +26,6 @@ import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.util.jsse.SSLContextParameters;
-import mousio.etcd4j.EtcdClient;
-import mousio.etcd4j.EtcdSecurityContext;
-
@UriParams
public class EtcdConfiguration implements CamelContextAware, Cloneable {
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.java
deleted file mode 100644
index 759a602..0000000
--- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancer.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.camel.component.ribbon.cloud;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.RejectedExecutionException;
-
-import com.netflix.client.config.IClientConfig;
-import com.netflix.client.config.IClientConfigKey;
-import com.netflix.loadbalancer.DummyPing;
-import com.netflix.loadbalancer.ILoadBalancer;
-import com.netflix.loadbalancer.PollingServerListUpdater;
-import com.netflix.loadbalancer.RoundRobinRule;
-import com.netflix.loadbalancer.Server;
-import com.netflix.loadbalancer.ServerList;
-import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
-import org.apache.camel.cloud.LoadBalancer;
-import org.apache.camel.cloud.LoadBalancerFunction;
-import org.apache.camel.cloud.ServiceDefinition;
-import org.apache.camel.cloud.ServiceDiscovery;
-import org.apache.camel.cloud.ServiceDiscoveryAware;
-import org.apache.camel.cloud.ServiceFilter;
-import org.apache.camel.cloud.ServiceFilterAware;
-import org.apache.camel.component.ribbon.RibbonConfiguration;
-import org.apache.camel.support.ServiceSupport;
-import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.ServiceHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RibbonLoadBalancer
- extends ServiceSupport
- implements CamelContextAware, ServiceDiscoveryAware, ServiceFilterAware, LoadBalancer {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(RibbonLoadBalancer.class);
-
- private final RibbonConfiguration configuration;
- private final ConcurrentMap<String, ZoneAwareLoadBalancer<RibbonServiceDefinition>> loadBalancers;
- private CamelContext camelContext;
- private ServiceDiscovery serviceDiscovery;
- private ServiceFilter serviceFilter;
-
- public RibbonLoadBalancer(RibbonConfiguration configuration) {
- this.configuration = configuration;
- this.loadBalancers = new ConcurrentHashMap<>();
- }
-
- @Override
- public CamelContext getCamelContext() {
- return camelContext;
- }
-
- @Override
- public void setCamelContext(CamelContext camelContext) {
- this.camelContext = camelContext;
- }
-
- @Override
- public ServiceDiscovery getServiceDiscovery() {
- return serviceDiscovery;
- }
-
- @Override
- public void setServiceDiscovery(ServiceDiscovery serviceDiscovery) {
- this.serviceDiscovery = serviceDiscovery;
- }
-
- @Override
- public ServiceFilter getServiceFilter() {
- return serviceFilter;
- }
-
- @Override
- public void setServiceFilter(ServiceFilter serviceFilter) {
- this.serviceFilter = serviceFilter;
- }
-
- // ************************
- // lifecycle
- // ************************
-
- @Override
- protected void doStart() throws Exception {
- ObjectHelper.notNull(configuration, "configuration");
- ObjectHelper.notNull(camelContext, "camel context");
-
- if (serviceDiscovery != null) {
- LOGGER.info("ServiceCall is using ribbon load balancer with service discovery type: {} and service filter: {}",
- serviceDiscovery.getClass(),
- serviceDiscovery != null ? serviceFilter.getClass() : "none");
- } else {
- LOGGER.info("ServiceCall is using ribbon load balancer");
- }
-
- ServiceHelper.startService(serviceDiscovery);
- }
-
- @Override
- protected void doStop() throws Exception {
- loadBalancers.values().forEach(ZoneAwareLoadBalancer::stopServerListRefreshing);
- loadBalancers.clear();
-
- ServiceHelper.stopService(serviceDiscovery);
- }
-
- // ************************
- // Processor
- // ************************
-
- @Override
- public <T> T process(String serviceName, LoadBalancerFunction<T> request) throws Exception {
- ILoadBalancer loadBalancer = loadBalancers.computeIfAbsent(serviceName, key -> createLoadBalancer(key));
- Server server = loadBalancer.chooseServer(serviceName);
-
- if (server == null) {
- throw new RejectedExecutionException("No active services with name " + serviceName);
- }
-
- ServiceDefinition definition;
-
- if (server instanceof ServiceDefinition) {
- // If the service discovery is one of camel provides, the definition
- // is already of the expected type.
- definition = (ServiceDefinition)server;
- } else {
- // If ribbon server list is configured through client config properties
- // i.e. with listOfServers property the instance provided by the load
- // balancer is of type Server so a conversion is needed
- definition = new RibbonServiceDefinition(
- serviceName,
- server.getHost(),
- server.getPort()
- );
-
- String zone = server.getZone();
- if (zone != null) {
- server.setZone(zone);
- }
- }
-
- return request.apply(definition);
- }
-
- // ************************
- // Helpers
- // ************************
-
- private ZoneAwareLoadBalancer<RibbonServiceDefinition> createLoadBalancer(String serviceName) {
- // setup client config
- IClientConfig config = configuration.getClientName() != null
- ? IClientConfig.Builder.newBuilder(configuration.getClientName()).build()
- : IClientConfig.Builder.newBuilder().build();
-
- if (configuration.getProperties() != null) {
- for (Map.Entry<String, String> entry : configuration.getProperties().entrySet()) {
- IClientConfigKey key = IClientConfigKey.Keys.valueOf(entry.getKey());
- String value = entry.getValue();
-
- LOGGER.debug("RibbonClientConfig: {}={}", key.key(), value);
- config.set(key, value);
- }
- }
-
- ZoneAwareLoadBalancer<RibbonServiceDefinition> loadBalancer;
-
- if (serviceDiscovery != null) {
- loadBalancer = new ZoneAwareLoadBalancer<>(
- config,
- configuration.getRuleOrDefault(RoundRobinRule::new),
- configuration.getPingOrDefault(DummyPing::new),
- new RibbonServerList(serviceName, serviceDiscovery, serviceFilter),
- null,
- new PollingServerListUpdater(config));
- } else {
- loadBalancer = new ZoneAwareLoadBalancer<>(config);
- }
-
- return loadBalancer;
- }
-
- static final class RibbonServerList implements ServerList<RibbonServiceDefinition> {
- private final String serviceName;
- private final ServiceDiscovery serviceDiscovery;
- private final ServiceFilter serviceFilter;
-
- RibbonServerList(String serviceName, ServiceDiscovery serviceDiscovery, ServiceFilter serviceFilter) {
- this.serviceName = serviceName;
- this.serviceDiscovery = serviceDiscovery;
- this.serviceFilter = serviceFilter;
- }
-
- @Override
- public List<RibbonServiceDefinition> getInitialListOfServers() {
- List<ServiceDefinition> services = serviceDiscovery.getServices(serviceName);
- if (serviceFilter != null) {
- services = serviceFilter.apply(services);
- }
-
- return asRibbonServerList(services);
- }
-
- @Override
- public List<RibbonServiceDefinition> getUpdatedListOfServers() {
- List<ServiceDefinition> services = serviceDiscovery.getServices(serviceName);
- if (serviceFilter != null) {
- services = serviceFilter.apply(services);
- }
-
- return asRibbonServerList(services);
- }
-
- private List<RibbonServiceDefinition> asRibbonServerList(List<ServiceDefinition> services) {
- List<RibbonServiceDefinition> ribbonServers = new ArrayList<>();
-
- for (ServiceDefinition service : services) {
- if (service instanceof RibbonServiceDefinition) {
- ribbonServers.add((RibbonServiceDefinition)service);
- } else {
- RibbonServiceDefinition serviceDef = new RibbonServiceDefinition(
- serviceName,
- service.getHost(),
- service.getPort(),
- service.getHealth()
- );
-
- String zone = serviceDef.getMetadata().get("zone");
- if (zone != null) {
- serviceDef.setZone(zone);
- }
-
- ribbonServers.add(serviceDef);
- }
- }
-
- return ribbonServers;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java
deleted file mode 100644
index f166011..0000000
--- a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonLoadBalancerFactory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.ribbon.cloud;
-
-import java.util.Map;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.cloud.LoadBalancer;
-import org.apache.camel.cloud.LoadBalancerFactory;
-import org.apache.camel.component.ribbon.RibbonConfiguration;
-
-public class RibbonLoadBalancerFactory implements LoadBalancerFactory {
- private final RibbonConfiguration configuration;
-
- public RibbonLoadBalancerFactory() {
- this(new RibbonConfiguration());
- }
-
- public RibbonLoadBalancerFactory(RibbonConfiguration configuration) {
- this.configuration = configuration;
- }
-
- // *************************************************************************
- // Properties
- // *************************************************************************
-
- public String getNamespace() {
- return configuration.getNamespace();
- }
-
- public void setNamespace(String namespace) {
- configuration.setNamespace(namespace);
- }
-
- public String getUsername() {
- return configuration.getUsername();
- }
-
- public void setUsername(String username) {
- configuration.setUsername(username);
- }
-
- public String getPassword() {
- return configuration.getPassword();
- }
-
- public void setPassword(String password) {
- configuration.setPassword(password);
- }
-
- public String getClientName() {
- return configuration.getClientName();
- }
-
- public void setClientName(String clientName) {
- configuration.setClientName(clientName);
- }
-
- public Map<String, String> getProperties() {
- return configuration.getProperties();
- }
-
- public void setProperties(Map<String, String> clientConfig) {
- configuration.setProperties(clientConfig);
- }
-
- // *************************************************************************
- // Factory
- // *************************************************************************
-
- @Override
- public LoadBalancer newInstance(CamelContext camelContext) throws Exception {
- return new RibbonLoadBalancer(configuration);
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancer.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancer.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancer.java
new file mode 100644
index 0000000..b5415c3
--- /dev/null
+++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancer.java
@@ -0,0 +1,259 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.component.ribbon.cloud;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.RejectedExecutionException;
+
+import com.netflix.client.config.IClientConfig;
+import com.netflix.client.config.IClientConfigKey;
+import com.netflix.loadbalancer.DummyPing;
+import com.netflix.loadbalancer.ILoadBalancer;
+import com.netflix.loadbalancer.PollingServerListUpdater;
+import com.netflix.loadbalancer.RoundRobinRule;
+import com.netflix.loadbalancer.Server;
+import com.netflix.loadbalancer.ServerList;
+import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.cloud.ServiceDefinition;
+import org.apache.camel.cloud.ServiceDiscovery;
+import org.apache.camel.cloud.ServiceDiscoveryAware;
+import org.apache.camel.cloud.ServiceFilter;
+import org.apache.camel.cloud.ServiceFilterAware;
+import org.apache.camel.cloud.ServiceLoadBalancer;
+import org.apache.camel.cloud.ServiceLoadBalancerFunction;
+import org.apache.camel.component.ribbon.RibbonConfiguration;
+import org.apache.camel.support.ServiceSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.ServiceHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RibbonServiceLoadBalancer
+ extends ServiceSupport
+ implements CamelContextAware, ServiceDiscoveryAware, ServiceFilterAware, ServiceLoadBalancer {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(RibbonServiceLoadBalancer.class);
+
+ private final RibbonConfiguration configuration;
+ private final ConcurrentMap<String, ZoneAwareLoadBalancer<RibbonServiceDefinition>> loadBalancers;
+ private CamelContext camelContext;
+ private ServiceDiscovery serviceDiscovery;
+ private ServiceFilter serviceFilter;
+
+ public RibbonServiceLoadBalancer(RibbonConfiguration configuration) {
+ this.configuration = configuration;
+ this.loadBalancers = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public CamelContext getCamelContext() {
+ return camelContext;
+ }
+
+ @Override
+ public void setCamelContext(CamelContext camelContext) {
+ this.camelContext = camelContext;
+ }
+
+ @Override
+ public ServiceDiscovery getServiceDiscovery() {
+ return serviceDiscovery;
+ }
+
+ @Override
+ public void setServiceDiscovery(ServiceDiscovery serviceDiscovery) {
+ this.serviceDiscovery = serviceDiscovery;
+ }
+
+ @Override
+ public ServiceFilter getServiceFilter() {
+ return serviceFilter;
+ }
+
+ @Override
+ public void setServiceFilter(ServiceFilter serviceFilter) {
+ this.serviceFilter = serviceFilter;
+ }
+
+ // ************************
+ // lifecycle
+ // ************************
+
+ @Override
+ protected void doStart() throws Exception {
+ ObjectHelper.notNull(configuration, "configuration");
+ ObjectHelper.notNull(camelContext, "camel context");
+
+ if (serviceDiscovery != null) {
+ LOGGER.info("ServiceCall is using ribbon load balancer with service discovery type: {} and service filter: {}",
+ serviceDiscovery.getClass(),
+ serviceDiscovery != null ? serviceFilter.getClass() : "none");
+ } else {
+ LOGGER.info("ServiceCall is using ribbon load balancer");
+ }
+
+ ServiceHelper.startService(serviceDiscovery);
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ loadBalancers.values().forEach(ZoneAwareLoadBalancer::stopServerListRefreshing);
+ loadBalancers.clear();
+
+ ServiceHelper.stopService(serviceDiscovery);
+ }
+
+ // ************************
+ // Processor
+ // ************************
+
+ @Override
+ public <T> T process(String serviceName, ServiceLoadBalancerFunction<T> request) throws Exception {
+ ILoadBalancer loadBalancer = loadBalancers.computeIfAbsent(serviceName, key -> createLoadBalancer(key));
+ Server server = loadBalancer.chooseServer(serviceName);
+
+ if (server == null) {
+ throw new RejectedExecutionException("No active services with name " + serviceName);
+ }
+
+ ServiceDefinition definition;
+
+ if (server instanceof ServiceDefinition) {
+ // If the service discovery is one of camel provides, the definition
+ // is already of the expected type.
+ definition = (ServiceDefinition)server;
+ } else {
+ // If ribbon server list is configured through client config properties
+ // i.e. with listOfServers property the instance provided by the load
+ // balancer is of type Server so a conversion is needed
+ definition = new RibbonServiceDefinition(
+ serviceName,
+ server.getHost(),
+ server.getPort()
+ );
+
+ String zone = server.getZone();
+ if (zone != null) {
+ server.setZone(zone);
+ }
+ }
+
+ return request.apply(definition);
+ }
+
+ // ************************
+ // Helpers
+ // ************************
+
+ private ZoneAwareLoadBalancer<RibbonServiceDefinition> createLoadBalancer(String serviceName) {
+ // setup client config
+ IClientConfig config = configuration.getClientName() != null
+ ? IClientConfig.Builder.newBuilder(configuration.getClientName()).build()
+ : IClientConfig.Builder.newBuilder().build();
+
+ if (configuration.getProperties() != null) {
+ for (Map.Entry<String, String> entry : configuration.getProperties().entrySet()) {
+ IClientConfigKey key = IClientConfigKey.Keys.valueOf(entry.getKey());
+ String value = entry.getValue();
+
+ LOGGER.debug("RibbonClientConfig: {}={}", key.key(), value);
+ config.set(key, value);
+ }
+ }
+
+ ZoneAwareLoadBalancer<RibbonServiceDefinition> loadBalancer;
+
+ if (serviceDiscovery != null) {
+ loadBalancer = new ZoneAwareLoadBalancer<>(
+ config,
+ configuration.getRuleOrDefault(RoundRobinRule::new),
+ configuration.getPingOrDefault(DummyPing::new),
+ new RibbonServerList(serviceName, serviceDiscovery, serviceFilter),
+ null,
+ new PollingServerListUpdater(config));
+ } else {
+ loadBalancer = new ZoneAwareLoadBalancer<>(config);
+ }
+
+ return loadBalancer;
+ }
+
+ static final class RibbonServerList implements ServerList<RibbonServiceDefinition> {
+ private final String serviceName;
+ private final ServiceDiscovery serviceDiscovery;
+ private final ServiceFilter serviceFilter;
+
+ RibbonServerList(String serviceName, ServiceDiscovery serviceDiscovery, ServiceFilter serviceFilter) {
+ this.serviceName = serviceName;
+ this.serviceDiscovery = serviceDiscovery;
+ this.serviceFilter = serviceFilter;
+ }
+
+ @Override
+ public List<RibbonServiceDefinition> getInitialListOfServers() {
+ List<ServiceDefinition> services = serviceDiscovery.getServices(serviceName);
+ if (serviceFilter != null) {
+ services = serviceFilter.apply(services);
+ }
+
+ return asRibbonServerList(services);
+ }
+
+ @Override
+ public List<RibbonServiceDefinition> getUpdatedListOfServers() {
+ List<ServiceDefinition> services = serviceDiscovery.getServices(serviceName);
+ if (serviceFilter != null) {
+ services = serviceFilter.apply(services);
+ }
+
+ return asRibbonServerList(services);
+ }
+
+ private List<RibbonServiceDefinition> asRibbonServerList(List<ServiceDefinition> services) {
+ List<RibbonServiceDefinition> ribbonServers = new ArrayList<>();
+
+ for (ServiceDefinition service : services) {
+ if (service instanceof RibbonServiceDefinition) {
+ ribbonServers.add((RibbonServiceDefinition)service);
+ } else {
+ RibbonServiceDefinition serviceDef = new RibbonServiceDefinition(
+ serviceName,
+ service.getHost(),
+ service.getPort(),
+ service.getHealth()
+ );
+
+ String zone = serviceDef.getMetadata().get("zone");
+ if (zone != null) {
+ serviceDef.setZone(zone);
+ }
+
+ ribbonServers.add(serviceDef);
+ }
+ }
+
+ return ribbonServers;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancerFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancerFactory.java b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancerFactory.java
new file mode 100644
index 0000000..0e328bf
--- /dev/null
+++ b/components/camel-ribbon/src/main/java/org/apache/camel/component/ribbon/cloud/RibbonServiceLoadBalancerFactory.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.ribbon.cloud;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.cloud.ServiceLoadBalancer;
+import org.apache.camel.cloud.ServiceLoadBalancerFactory;
+import org.apache.camel.component.ribbon.RibbonConfiguration;
+
+public class RibbonServiceLoadBalancerFactory implements ServiceLoadBalancerFactory {
+ private final RibbonConfiguration configuration;
+
+ public RibbonServiceLoadBalancerFactory() {
+ this(new RibbonConfiguration());
+ }
+
+ public RibbonServiceLoadBalancerFactory(RibbonConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+ // *************************************************************************
+ // Properties
+ // *************************************************************************
+
+ public String getNamespace() {
+ return configuration.getNamespace();
+ }
+
+ public void setNamespace(String namespace) {
+ configuration.setNamespace(namespace);
+ }
+
+ public String getUsername() {
+ return configuration.getUsername();
+ }
+
+ public void setUsername(String username) {
+ configuration.setUsername(username);
+ }
+
+ public String getPassword() {
+ return configuration.getPassword();
+ }
+
+ public void setPassword(String password) {
+ configuration.setPassword(password);
+ }
+
+ public String getClientName() {
+ return configuration.getClientName();
+ }
+
+ public void setClientName(String clientName) {
+ configuration.setClientName(clientName);
+ }
+
+ public Map<String, String> getProperties() {
+ return configuration.getProperties();
+ }
+
+ public void setProperties(Map<String, String> clientConfig) {
+ configuration.setProperties(clientConfig);
+ }
+
+ // *************************************************************************
+ // Factory
+ // *************************************************************************
+
+ @Override
+ public ServiceLoadBalancer newInstance(CamelContext camelContext) throws Exception {
+ return new RibbonServiceLoadBalancer(configuration);
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer b/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer
deleted file mode 100644
index 161ac23..0000000
--- a/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-load-balancer
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-class=org.apache.camel.component.ribbon.cloud.RibbonLoadBalancerFactory
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-service-load-balancer
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-service-load-balancer b/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-service-load-balancer
new file mode 100644
index 0000000..65c38dd
--- /dev/null
+++ b/components/camel-ribbon/src/main/resources/META-INF/services/org/apache/camel/cloud/ribbon-service-load-balancer
@@ -0,0 +1,17 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+class=org.apache.camel.component.ribbon.cloud.RibbonServiceLoadBalancerFactory
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java
index f0d5dc3..a1f9c54 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServerListTest.java
@@ -31,7 +31,7 @@ public class RibbonServerListTest {
@Test
public void testFixedServerList() throws Exception {
ZoneAwareLoadBalancer<RibbonServiceDefinition> lb = LoadBalancerBuilder.<RibbonServiceDefinition>newBuilder()
- .withDynamicServerList(new RibbonLoadBalancer.RibbonServerList(
+ .withDynamicServerList(new RibbonServiceLoadBalancer.RibbonServerList(
"unknown",
StaticServiceDiscovery.forServices(
new RibbonServiceDefinition("unknown", "localhost", 9090),
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java
index 7f95639..5be0344 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRegistryRouteTest.java
@@ -35,7 +35,7 @@ public class RibbonServiceCallRegistryRouteTest extends RibbonServiceCallRouteTe
servers.addServer("localhost", 9091);
RibbonConfiguration configuration = new RibbonConfiguration();
- RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(configuration);
+ RibbonServiceLoadBalancer loadBalancer = new RibbonServiceLoadBalancer(configuration);
// configure camel service call
ServiceCallConfigurationDefinition config = new ServiceCallConfigurationDefinition();
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java
index 6bda099..1b87c7a 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallRouteTest.java
@@ -50,7 +50,7 @@ public class RibbonServiceCallRouteTest extends CamelTestSupport {
servers.addServer("localhost", 9091);
RibbonConfiguration configuration = new RibbonConfiguration();
- RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(configuration);
+ RibbonServiceLoadBalancer loadBalancer = new RibbonServiceLoadBalancer(configuration);
from("direct:start")
.serviceCall()
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java
index 27aba3e..38efa72 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/RibbonServiceCallUpdateRouteTest.java
@@ -75,7 +75,7 @@ public class RibbonServiceCallUpdateRouteTest extends CamelTestSupport {
RibbonConfiguration configuration = new RibbonConfiguration();
// lets update quick so we do not have to sleep so much in the tests
configuration.addProperty("ServerListRefreshInterval", "250");
- RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(configuration);
+ RibbonServiceLoadBalancer loadBalancer = new RibbonServiceLoadBalancer(configuration);
from("direct:start")
.serviceCall()
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java
index 9c99aec..5cbf8c4 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringBeanServiceCallRouteTest.java
@@ -17,6 +17,10 @@
package org.apache.camel.component.ribbon.cloud;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
+import org.apache.camel.impl.cloud.StaticServiceDiscovery;
+import org.junit.Assert;
+import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.annotation.DirtiesContext;
@@ -27,5 +31,16 @@ public class SpringBeanServiceCallRouteTest extends SpringRibbonServiceCallRoute
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml");
}
+
+ @Test
+ public void testServiceCallConfiguration() throws Exception {
+ DefaultServiceCallProcessor processor = findServiceCallProcessor();
+
+ Assert.assertNotNull(processor.getLoadBalancer());
+ Assert.assertTrue(processor.getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+
+ RibbonServiceLoadBalancer loadBalancer = (RibbonServiceLoadBalancer)processor.getLoadBalancer();
+ Assert.assertTrue(loadBalancer.getServiceDiscovery() instanceof StaticServiceDiscovery);
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.java
index 9456b7a..56d734f 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.java
@@ -17,6 +17,9 @@
package org.apache.camel.component.ribbon.cloud;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
+import org.junit.Assert;
+import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.annotation.DirtiesContext;
@@ -27,5 +30,16 @@ public class SpringDslRibbonPropertiesServiceCallRouteTest extends SpringRibbonS
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.xml");
}
+
+ @Test
+ public void testServiceCallConfiguration() throws Exception {
+ DefaultServiceCallProcessor processor = findServiceCallProcessor();
+
+ Assert.assertNotNull(processor.getLoadBalancer());
+ Assert.assertTrue(processor.getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+
+ RibbonServiceLoadBalancer loadBalancer = (RibbonServiceLoadBalancer)processor.getLoadBalancer();
+ Assert.assertNull(loadBalancer.getServiceDiscovery());
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java
index 34269b3..bb5304e 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.java
@@ -17,6 +17,10 @@
package org.apache.camel.component.ribbon.cloud;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
+import org.apache.camel.impl.cloud.StaticServiceDiscovery;
+import org.junit.Assert;
+import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.annotation.DirtiesContext;
@@ -27,5 +31,16 @@ public class SpringDslRibbonServiceCallRouteTest extends SpringRibbonServiceCall
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml");
}
+
+ @Test
+ public void testServiceCallConfiguration() throws Exception {
+ DefaultServiceCallProcessor processor = findServiceCallProcessor();
+
+ Assert.assertNotNull(processor.getLoadBalancer());
+ Assert.assertTrue(processor.getLoadBalancer() instanceof RibbonServiceLoadBalancer);
+
+ RibbonServiceLoadBalancer loadBalancer = (RibbonServiceLoadBalancer)processor.getLoadBalancer();
+ Assert.assertTrue(loadBalancer.getServiceDiscovery() instanceof StaticServiceDiscovery);
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java
index 3c9e8b2..0ca03f8 100644
--- a/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java
+++ b/components/camel-ribbon/src/test/java/org/apache/camel/component/ribbon/cloud/SpringRibbonServiceCallRouteTest.java
@@ -17,7 +17,14 @@
package org.apache.camel.component.ribbon.cloud;
+import java.util.Optional;
+
+import org.apache.camel.Navigate;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Assert;
import org.junit.Test;
import org.springframework.test.annotation.DirtiesContext;
@@ -36,5 +43,32 @@ public abstract class SpringRibbonServiceCallRouteTest extends CamelSpringTestSu
assertMockEndpointsSatisfied();
}
+
+ // ************************************
+ // Helpers
+ // ************************************
+
+ protected DefaultServiceCallProcessor findServiceCallProcessor() {
+ Route route = context().getRoute("scall");
+
+ Assert.assertNotNull("ServiceCall Route should be present", route);
+
+ return findServiceCallProcessor(route.navigate())
+ .orElseThrow(() -> new IllegalStateException("Unable to find a ServiceCallProcessor"));
+ }
+
+ protected Optional<DefaultServiceCallProcessor> findServiceCallProcessor(Navigate<Processor> navigate) {
+ for (Processor processor : navigate.next()) {
+ if (processor instanceof DefaultServiceCallProcessor) {
+ return Optional.ofNullable((DefaultServiceCallProcessor)processor);
+ }
+
+ if (processor instanceof Navigate) {
+ return findServiceCallProcessor((Navigate<Processor>)processor);
+ }
+ }
+
+ return Optional.empty();
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml
index 01e59d9..22ad55c 100644
--- a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml
+++ b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringBeanRibbonServiceCallRouteTest.xml
@@ -28,7 +28,7 @@
<property name="servers" value="localhost:9090,localhost:9091"/>
</bean>
- <bean id="balancer" class="org.apache.camel.component.ribbon.cloud.RibbonLoadBalancer">
+ <bean id="balancer" class="org.apache.camel.component.ribbon.cloud.RibbonServiceLoadBalancer">
<constructor-arg index="0">
<bean class="org.apache.camel.component.ribbon.RibbonConfiguration"/>
</constructor-arg>
@@ -39,7 +39,7 @@
<!-- service call configuration to use ribbon -->
<serviceCallConfiguration id="ribbon" loadBalancerRef="balancer" serviceDiscoveryRef="discovery"/>
- <route>
+ <route id="scall">
<from uri="direct:start"/>
<serviceCall name="myService"/>
<to uri="mock:result"/>
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.xml b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.xml
index b182bc2..3c92e91 100644
--- a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.xml
+++ b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonPropertiesServiceCallRouteTest.xml
@@ -24,7 +24,7 @@
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns="http://camel.apache.org/schema/spring">
- <route>
+ <route id="scall">
<from uri="direct:start"/>
<serviceCall name="myService">
<!-- enable ribbon load balancer -->
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml
index 48ce72a..8a40924 100644
--- a/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml
+++ b/components/camel-ribbon/src/test/resources/org/apache/camel/component/ribbon/cloud/SpringDslRibbonServiceCallRouteTest.xml
@@ -24,7 +24,7 @@
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns="http://camel.apache.org/schema/spring">
- <route>
+ <route id="scall">
<from uri="direct:start"/>
<serviceCall name="myService">
<!-- static list of servers -->
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java
index 937e042..31ebf09 100644
--- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java
+++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/cloud/CamelCloudConfigurationProperties.java
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.Map;
import org.apache.camel.Expression;
+import org.apache.camel.cloud.ServiceLoadBalancer;
import org.apache.camel.model.cloud.ServiceCallConstants;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -93,7 +94,7 @@ public class CamelCloudConfigurationProperties {
private String serviceChooser;
/**
- * A reference to the {@link org.apache.camel.cloud.LoadBalancer} to use.
+ * A reference to the {@link ServiceLoadBalancer} to use.
*/
private String loadBalancer;
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java
index 282af31..3f3415a 100644
--- a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java
+++ b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/cloud/CamelCloudServiceCallConfigurationTest.java
@@ -17,7 +17,7 @@
package org.apache.camel.spring.boot.cloud;
-import org.apache.camel.cloud.LoadBalancer;
+import org.apache.camel.cloud.ServiceLoadBalancer;
import org.apache.camel.cloud.ServiceChooser;
import org.apache.camel.cloud.ServiceDiscovery;
import org.apache.camel.cloud.ServiceFilter;
@@ -70,7 +70,7 @@ public class CamelCloudServiceCallConfigurationTest {
assertTrue(ctx.getBeansOfType(ServiceDiscovery.class).isEmpty());
assertTrue(ctx.getBeansOfType(ServiceFilter.class).isEmpty());
assertTrue(ctx.getBeansOfType(ServiceChooser.class).isEmpty());
- assertTrue(ctx.getBeansOfType(LoadBalancer.class).isEmpty());
+ assertTrue(ctx.getBeansOfType(ServiceLoadBalancer.class).isEmpty());
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/ecc81927/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java b/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java
deleted file mode 100644
index bfd6ab8..0000000
--- a/components/camel-spring-cloud/src/main/java/org/apache/camel/spring/cloud/CamelSpringCloudLoadBalancer.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.spring.cloud;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
-import org.apache.camel.cloud.LoadBalancer;
-import org.apache.camel.cloud.LoadBalancerFunction;
-import org.apache.camel.cloud.ServiceDefinition;
-import org.apache.camel.impl.cloud.DefaultServiceDefinition;
-import org.apache.camel.support.ServiceSupport;
-import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.cloud.client.ServiceInstance;
-import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
-
-public class CamelSpringCloudLoadBalancer extends ServiceSupport implements CamelContextAware, LoadBalancer {
- private static final Logger LOGGER = LoggerFactory.getLogger(CamelSpringCloudLoadBalancer.class);
-
- private final LoadBalancerClient loadBalancerClient;
- private CamelContext camelContext;
-
- public CamelSpringCloudLoadBalancer(LoadBalancerClient loadBalancerClient) {
- this.loadBalancerClient = loadBalancerClient;
- }
-
- @Override
- public CamelContext getCamelContext() {
- return camelContext;
- }
-
- @Override
- public void setCamelContext(CamelContext camelContext) {
- this.camelContext = camelContext;
- }
-
- @Override
- protected void doStart() throws Exception {
- ObjectHelper.notNull(camelContext, "camelContext");
- ObjectHelper.notNull(loadBalancerClient, "loadBalancerClient");
-
- LOGGER.info("ServiceCall is using cloud load balancer of type: {}", loadBalancerClient.getClass());
- }
-
- @Override
- protected void doStop() throws Exception {
- }
-
- @Override
- public <T> T process(String serviceName, LoadBalancerFunction<T> function) throws Exception {
- return loadBalancerClient.execute(serviceName, i -> function.apply(instanceToDefinition(i)));
- }
-
- // *******************************
- // Helpers
- // *******************************
-
- private ServiceDefinition instanceToDefinition(ServiceInstance instance) {
- return new DefaultServiceDefinition(
- instance.getServiceId(),
- instance.getHost(),
- instance.getPort(),
- instance.getMetadata()
- );
- }
-}
\ No newline at end of file