You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mi...@apache.org on 2009/03/13 21:39:18 UTC

svn commit: r753391 - /ode/trunk/axis2/src/main/java/org/apache/ode/axis2/soapbinding/SoapExternalService.java

Author: midon
Date: Fri Mar 13 20:39:09 2009
New Revision: 753391

URL: http://svn.apache.org/viewvc?rev=753391&view=rev
Log:
 ODE-549: avoid a race condition in ServiceClient.setAxisService()

Modified:
    ode/trunk/axis2/src/main/java/org/apache/ode/axis2/soapbinding/SoapExternalService.java

Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/soapbinding/SoapExternalService.java
URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/soapbinding/SoapExternalService.java?rev=753391&r1=753390&r2=753391&view=diff
==============================================================================
--- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/soapbinding/SoapExternalService.java (original)
+++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/soapbinding/SoapExternalService.java Fri Mar 13 20:39:09 2009
@@ -128,6 +128,7 @@
         }
     }
 
+
     public void invoke(final PartnerRoleMessageExchange odeMex) {
         boolean isTwoWay = odeMex.getMessageExchangePattern() == org.apache.ode.bpel.iapi.MessageExchange.MessageExchangePattern.REQUEST_RESPONSE;
         try {
@@ -218,19 +219,29 @@
             throw AxisFault.makeFault(e.getCause() != null ? e.getCause() : e);
         }
 
-        // apply the options to the service client
-        ServiceClient serviceClient = _cachedClients.get();
-        if (serviceClient == null) {
-            serviceClient = new ServiceClient(_configContext, null);
-            _cachedClients.set(serviceClient);
-        }
         AxisService anonymousService = _axisServiceWatchDog.getObserver().get();
-        serviceClient.setAxisService(anonymousService);
-        serviceClient.setOptions(_axisOptionsWatchDog.getObserver().get());
+        ServiceClient client = _cachedClients.get();
+        if (client == null || !client.getAxisService().getName().equals(anonymousService.getName())) {
+            // avoid race conditions in AxisConfiguration
+            synchronized (_axisConfig) {
+                // if the service has changed, discard the client and create a new one
+                if (client != null) {
+                    if(__log.isDebugEnabled()) __log.debug("Clean up and discard ServiceClient");
+                    client.cleanup();
+                }
+                if(__log.isDebugEnabled()) __log.debug("Create a new ServiceClient for "+anonymousService.getName());
+                client = new ServiceClient(_configContext, null);
+                client.setAxisService(anonymousService);
+            }
+            _cachedClients.set(client);
+        }
+
+        // apply the options to the service client
+        client.setOptions(_axisOptionsWatchDog.getObserver().get());
 
-        applySecuritySettings(serviceClient);
+        applySecuritySettings(client);
 
-        return serviceClient;
+        return client;
     }
     private void applySecuritySettings(ServiceClient serviceClient) throws AxisFault {
         Options options = serviceClient.getOptions();
@@ -398,7 +409,6 @@
      * this service-specific config file.
      */
     private class ServiceFileObserver extends WatchDog.DefaultObserver<AxisService> {
-        String serviceName = "axis_service_for_" + _serviceName + "#" + _portName + "_" + new GUID().toString();
         File file;
 
         private ServiceFileObserver(File file) {
@@ -406,9 +416,10 @@
         }
 
         public void init() {
-// create an anonymous axis service that will be used by the ServiceClient
+            // create an anonymous axis service that will be used by the ServiceClient
             // this service will be added to the AxisConfig so do not reuse the name of the external service
             // as it could blow up if the service is deployed in the same axis2 instance
+            String serviceName = "axis_service_for_" + _serviceName + "#" + _portName + "_" + new GUID().toString();
             object = new AxisService(serviceName);
             object.setParent(_axisConfig);
 
@@ -429,9 +440,10 @@
             // and load the new config.
             init(); // create a new ServiceClient instance
             try {
+                String name = object.getName();
                  AxisUtils.configureService(_configContext, object, file.toURI().toURL());
                  // do not allow the service.xml file to change the service name
-                 object.setName(serviceName);
+                 object.setName(name);
             } catch (Exception e) {
                 if (__log.isWarnEnabled()) __log.warn("Exception while configuring service: " + _serviceName, e);
                 throw new RuntimeException("Exception while configuring service: " + _serviceName, e);