You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by wt...@apache.org on 2010/12/07 23:52:02 UTC

svn commit: r1043223 - in /camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf: CxfEndpoint.java CxfProducer.java CxfSpringEndpoint.java DefaultCxfBinding.java

Author: wtam
Date: Tue Dec  7 22:52:02 2010
New Revision: 1043223

URL: http://svn.apache.org/viewvc?rev=1043223&view=rev
Log:
[CAMEL-3386] removed client cache in CxfProvider based on Willem's feedback

Modified:
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfSpringEndpoint.java
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java?rev=1043223&r1=1043222&r2=1043223&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java Tue Dec  7 22:52:02 2010
@@ -98,8 +98,7 @@ public class CxfEndpoint extends Default
     private boolean loggingFeatureEnabled;
     private String address;
     private boolean mtomEnabled;
-    private int maxClientCacheSize = 10;
-    
+
     public CxfEndpoint(String remaining, CxfComponent cxfComponent) {
         super(remaining, cxfComponent);
         setAddress(remaining);        
@@ -247,12 +246,12 @@ public class CxfEndpoint extends Default
     /**
      * Populate a client factory bean
      */
-    protected void setupClientFactoryBean(ClientProxyFactoryBean factoryBean, Class<?> cls, String serviceAddress) {       
+    protected void setupClientFactoryBean(ClientProxyFactoryBean factoryBean, Class<?> cls) {       
         // service class
         factoryBean.setServiceClass(cls);
         
         // address
-        factoryBean.setAddress(serviceAddress);
+        factoryBean.setAddress(getAddress());
 
         // wsdl url
         if (getWsdlURL() != null) {
@@ -290,9 +289,9 @@ public class CxfEndpoint extends Default
         
     }
 
-    protected void setupClientFactoryBean(ClientFactoryBean factoryBean, String serviceAddress) {       
+    protected void setupClientFactoryBean(ClientFactoryBean factoryBean) {       
         // address
-        factoryBean.setAddress(serviceAddress);
+        factoryBean.setAddress(getAddress());
 
         // wsdl url
         if (getWsdlURL() != null) {
@@ -336,13 +335,6 @@ public class CxfEndpoint extends Default
      * Create a CXF client object
      */
     Client createClient() throws Exception {
-        return createClient(getAddress());
-    }
-    
-    /**
-     * Create a CXF client object
-     */
-    Client createClient(String serviceAddress) throws Exception {
 
         // get service class
         if (getDataFormat().equals(DataFormat.POJO)) { 
@@ -355,14 +347,14 @@ public class CxfEndpoint extends Default
             // create client factory bean
             ClientProxyFactoryBean factoryBean = createClientFactoryBean(cls);
             // setup client factory bean
-            setupClientFactoryBean(factoryBean, cls, serviceAddress);
+            setupClientFactoryBean(factoryBean, cls);
             return ((ClientProxy)Proxy.getInvocationHandler(factoryBean.create())).getClient();
         } else {            
             checkName(portName, "endpoint/port name");
             checkName(serviceName, "service name");
             ClientFactoryBean factoryBean = createClientFactoryBean();
             // setup client factory bean
-            setupClientFactoryBean(factoryBean, serviceAddress);
+            setupClientFactoryBean(factoryBean);
             return factoryBean.create();
         }
         
@@ -591,20 +583,6 @@ public class CxfEndpoint extends Default
     }
 
     /**
-     * @param maxClientCacheSize the maxClientCacheSize to set
-     */
-    public void setMaxClientCacheSize(int maxClientCacheSize) {
-        this.maxClientCacheSize = maxClientCacheSize;
-    }
-
-    /**
-     * @return the maxClientCacheSize
-     */
-    public int getMaxClientCacheSize() {
-        return maxClientCacheSize;
-    }
-
-    /**
      * We need to override the {@link ClientImpl#setParameters} method
      * to insert parameters into CXF Message for {@link DataFormat#PAYLOAD} mode.
      */

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java?rev=1043223&r1=1043222&r2=1043223&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java Tue Dec  7 22:52:02 2010
@@ -17,7 +17,6 @@
 package org.apache.camel.component.cxf;
 
 import java.io.InputStream;
-import java.lang.ref.SoftReference;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -33,9 +32,7 @@ import org.apache.camel.AsyncProcessor;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.component.cxf.util.CxfEndpointUtils;
 import org.apache.camel.impl.DefaultProducer;
-import org.apache.camel.util.LRUCache;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -56,9 +53,9 @@ import org.apache.cxf.service.model.Bind
  */
 public class CxfProducer extends DefaultProducer implements AsyncProcessor {
     private static final Log LOG = LogFactory.getLog(CxfProducer.class);
+    private Client client;
     private CxfEndpoint endpoint;
-    private ClientCache clientCache;
-    
+
     /**
      * Constructor to create a CxfProducer.  It will create a CXF client
      * object.
@@ -70,7 +67,7 @@ public class CxfProducer extends Default
     public CxfProducer(CxfEndpoint endpoint) throws Exception {
         super(endpoint);
         this.endpoint = endpoint;
-        clientCache = new ClientCache(endpoint.getMaxClientCacheSize());
+        client = endpoint.createClient();
     }
     
     // As the cxf client async and sync api is implement different,
@@ -84,10 +81,8 @@ public class CxfProducer extends Default
             // create CXF exchange
             ExchangeImpl cxfExchange = new ExchangeImpl();
             
-            Client client = clientCache.get(CxfEndpointUtils.getEffectiveAddress(camelExchange, endpoint.getAddress()));
-
             // prepare binding operation info
-            BindingOperationInfo boi = prepareBindingOperation(camelExchange, cxfExchange, client);
+            BindingOperationInfo boi = prepareBindingOperation(camelExchange, cxfExchange);
             
             Map<String, Object> invocationContext = new HashMap<String, Object>();
             Map<String, Object> responseContext = new HashMap<String, Object>();
@@ -96,7 +91,7 @@ public class CxfProducer extends Default
             
             CxfClientCallback cxfClientCallback = new CxfClientCallback(callback, camelExchange, cxfExchange, boi, endpoint);
             // send the CXF async request
-            client.invoke(cxfClientCallback, boi, getParams(endpoint, camelExchange, client), 
+            client.invoke(cxfClientCallback, boi, getParams(endpoint, camelExchange), 
                           invocationContext, cxfExchange);
         } catch (Throwable ex) {
             // error occurred before we had a chance to go async
@@ -121,20 +116,17 @@ public class CxfProducer extends Default
         // create CXF exchange
         ExchangeImpl cxfExchange = new ExchangeImpl();
         
-        Client client = clientCache.get(CxfEndpointUtils.getEffectiveAddress(camelExchange, endpoint.getAddress()));
-
         // prepare binding operation info
-        BindingOperationInfo boi = prepareBindingOperation(camelExchange, cxfExchange, client);
+        BindingOperationInfo boi = prepareBindingOperation(camelExchange, cxfExchange);
         
         Map<String, Object> invocationContext = new HashMap<String, Object>();
         Map<String, Object> responseContext = new HashMap<String, Object>();
         invocationContext.put(Client.RESPONSE_CONTEXT, responseContext);
         invocationContext.put(Client.REQUEST_CONTEXT, prepareRequest(camelExchange, cxfExchange));
-                
         
         try {
             // send the CXF request
-            client.invoke(boi, getParams(endpoint, camelExchange, client), 
+            client.invoke(boi, getParams(endpoint, camelExchange), 
                       invocationContext, cxfExchange);
         } finally {
             // bind the CXF response to Camel exchange
@@ -187,9 +179,9 @@ public class CxfProducer extends Default
         return requestContext.getWrappedMap();
     }
     
-    private BindingOperationInfo prepareBindingOperation(Exchange camelExchange, org.apache.cxf.message.Exchange cxfExchange, Client client) {
+    private BindingOperationInfo prepareBindingOperation(Exchange camelExchange, org.apache.cxf.message.Exchange cxfExchange) {
         // get binding operation info
-        BindingOperationInfo boi = getBindingOperationInfo(camelExchange, client);
+        BindingOperationInfo boi = getBindingOperationInfo(camelExchange);
         ObjectHelper.notNull(boi, "BindingOperationInfo");
         
         // keep the message wrapper in PAYLOAD mode
@@ -217,8 +209,8 @@ public class CxfProducer extends Default
         return  boi;
     }
     
-    private void checkParameterSize(CxfEndpoint endpoint, Exchange exchange, Object[] parameters, Client client) {
-        BindingOperationInfo boi = getBindingOperationInfo(exchange, client);
+    private void checkParameterSize(CxfEndpoint endpoint, Exchange exchange, Object[] parameters) {
+        BindingOperationInfo boi = getBindingOperationInfo(exchange);
         if (boi == null) {
             throw new RuntimeCamelException("Can't find the binding operation information from camel exchange");
         }
@@ -262,7 +254,7 @@ public class CxfProducer extends Default
     /**
      * Get the parameters for the web service operation
      */
-    private Object[] getParams(CxfEndpoint endpoint, Exchange exchange, Client client) throws InvalidPayloadException {
+    private Object[] getParams(CxfEndpoint endpoint, Exchange exchange) throws InvalidPayloadException {
       
         Object[] params = null;
         if (endpoint.getDataFormat() == DataFormat.POJO) {
@@ -286,7 +278,7 @@ public class CxfProducer extends Default
                 }
             }
             // make sure we have the right number of parameters
-            checkParameterSize(endpoint, exchange, params, client);
+            checkParameterSize(endpoint, exchange, params);
 
         } else if (endpoint.getDataFormat() == DataFormat.PAYLOAD) {
             params = new Object[1];
@@ -311,7 +303,7 @@ public class CxfProducer extends Default
      * Get operation name from header and use it to lookup and return a 
      * {@link BindingOperationInfo}.
      */
-    private BindingOperationInfo getBindingOperationInfo(Exchange ex, Client client) {
+    private BindingOperationInfo getBindingOperationInfo(Exchange ex) {
         CxfEndpoint endpoint = (CxfEndpoint)this.getEndpoint();
         BindingOperationInfo answer = null;
         String lp = ex.getIn().getHeader(CxfConstants.OPERATION_NAME, String.class);
@@ -353,46 +345,9 @@ public class CxfProducer extends Default
         }
         return answer;
     }
-
-    // only invoked by unit test
-    public Client getClient() throws Exception {
-        return  clientCache.get(endpoint.getAddress());
+    
+    public Client getClient() {
+        return client;
     }
 
-    /**
-     * Cache contains {@link org.apache.cxf.endpoint.Client}
-     */
-    private class ClientCache {
-        private LRUCache<String, SoftReference<Client>> cache;    
-        
-        public ClientCache(final int maxCacheSize) {
-            this.cache = new LRUCache<String, SoftReference<Client>>(maxCacheSize);
-        }
-
-        public Client get(String address) throws Exception {
-            Client retval = null;
-            synchronized (cache) {
-                SoftReference<Client> ref = cache.get(address);
-                
-                if (ref != null) {
-                    retval = ref.get();
-                }
-
-                if (retval == null) {
-                    retval = ((CxfEndpoint)getEndpoint()).createClient(address);
-                    cache.put(address, new SoftReference<Client>(retval));
-                    
-                    if (LOG.isTraceEnabled()) {
-                        LOG.trace("Created CXF client and add to cache for address '" + address + "'");
-                    }
-                    
-                } else {
-                    if (LOG.isTraceEnabled()) {
-                        LOG.trace("Retrieved CXF client from cache for address '" + address + "'");
-                    }
-                }
-            }
-            return retval;
-        }
-    }
 }

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfSpringEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfSpringEndpoint.java?rev=1043223&r1=1043222&r2=1043223&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfSpringEndpoint.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfSpringEndpoint.java Tue Dec  7 22:52:02 2010
@@ -103,7 +103,7 @@ public class CxfSpringEndpoint extends C
      * Create a CXF Client
      */
     @Override
-    Client createClient(String serviceAddress) throws Exception {
+    Client createClient() throws Exception {
         
         // get service class
         Class<?> cls = getSEIClass();    
@@ -120,7 +120,7 @@ public class CxfSpringEndpoint extends C
             configure(factoryBean);
 
             // setup client factory bean
-            setupClientFactoryBean(factoryBean, cls, serviceAddress);
+            setupClientFactoryBean(factoryBean, cls);
 
             // fill in values that have not been filled.
             QName serviceQName = null;
@@ -145,7 +145,7 @@ public class CxfSpringEndpoint extends C
             configure(factoryBean);
             
             // setup client factory bean
-            setupClientFactoryBean(factoryBean, serviceAddress);
+            setupClientFactoryBean(factoryBean);
             
             // fill in values that have not been filled.
             QName serviceQName = null;

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java?rev=1043223&r1=1043222&r2=1043223&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java Tue Dec  7 22:52:02 2010
@@ -92,6 +92,16 @@ public class DefaultCxfBinding implement
         propagateHeadersFromCamelToCxf(camelExchange, camelHeaders, cxfExchange, 
                 requestContext);
         
+        String overrideAddress = camelExchange.getIn().getHeader(Exchange.DESTINATION_OVERRIDE_URL, String.class);
+
+        if (overrideAddress != null) {
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Client address is overridden by header '" + Exchange.DESTINATION_OVERRIDE_URL
+                          + "' to value '" + overrideAddress + "'");
+            }
+            requestContext.put(Message.ENDPOINT_ADDRESS, overrideAddress);
+        }
+        
         // propagate attachments
         Set<Attachment> attachments = null;
         boolean isXop = Boolean.valueOf(camelExchange.getProperty(Message.MTOM_ENABLED, String.class));