io.fabric8.camel.FabricComponent Maven / Gradle / Ivy
/**
* Copyright 2005-2014 Red Hat, Inc.
*
* Red Hat 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 io.fabric8.camel;
import org.apache.camel.Endpoint;
import org.apache.camel.impl.ProducerCache;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.ServiceHelper;
import org.apache.camel.util.URISupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
/**
* The FABRIC camel component for providing endpoint discovery, clustering and load balancing.
*/
public class FabricComponent extends ZKComponentSupport {
private static final transient Log LOG = LogFactory.getLog(FabricComponent.class);
private String zkRoot = "/fabric/registry/camel/endpoints";
private LoadBalancerFactory loadBalancerFactory = new DefaultLoadBalancerFactory();
private ProducerCache producerCache;
private int cacheSize = 1000;
public String getZkRoot() {
return zkRoot;
}
public void setZkRoot(String zkRoot) {
this.zkRoot = zkRoot;
}
public int getCacheSize() {
return cacheSize;
}
public void setCacheSize(int cacheSize) {
this.cacheSize = cacheSize;
}
public ProducerCache getProducerCache() {
return producerCache;
}
public void setProducerCache(ProducerCache producerCache) {
this.producerCache = producerCache;
}
public LoadBalancerFactory getLoadBalancerFactory() {
return loadBalancerFactory;
}
public void setLoadBalancerFactory(LoadBalancerFactory loadBalancerFactory) {
this.loadBalancerFactory = loadBalancerFactory;
}
// Implementation methods
//-------------------------------------------------------------------------
@Override
protected void doStart() throws Exception {
super.doStart();
if (producerCache == null) {
producerCache = new ProducerCache(this, getCamelContext(), cacheSize);
}
ServiceHelper.startService(producerCache);
}
@Override
protected void doStop() throws Exception {
ServiceHelper.stopService(producerCache);
super.doStop();
}
@Override
protected Endpoint createEndpoint(String uri, String remaining, Map params) throws Exception {
int idx = remaining.indexOf(':');
if (idx > 0) {
// we are registering a regular endpoint
String name = remaining.substring(0, idx);
// need to replace the "0.0.0.0" with the host and port
String childUri = replaceAnyIpAddress(remaining.substring(idx + 1));
// we need to apply the params here
if (params != null && params.size() > 0) {
childUri = childUri + "?" + URISupport.createQueryString(params);
}
return new FabricPublisherEndpoint(uri, this, name, childUri);
} else {
return new FabricLocatorEndpoint(uri, this, remaining);
}
}
protected String getFabricPath(String name) {
String path = name;
if (ObjectHelper.isNotEmpty(zkRoot)) {
path = zkRoot + "/" + name;
}
return path;
}
protected String replaceAnyIpAddress(String uri) {
String result = uri;
//TODO do we need to support the IPV6 ?
if (uri.indexOf("0.0.0.0") > 0) {
try {
String hostAddress = InetAddress.getLocalHost().getHostAddress();
result = uri.replace("0.0.0.0", hostAddress);
} catch (UnknownHostException ex) {
LOG.warn("Cannot find the local host name, due to {0}", ex);
}
}
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy