[jbossws-commits] JBossWS SVN: r14922 - in stack/cxf/trunk/modules/addons/transports/http/httpserver/src: test/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver and 1 other directory.

jbossws-commits at lists.jboss.org jbossws-commits at lists.jboss.org
Fri Sep 2 01:21:39 EDT 2011


Author: mageshbk at jboss.com
Date: 2011-09-02 01:21:38 -0400 (Fri, 02 Sep 2011)
New Revision: 14922

Modified:
   stack/cxf/trunk/modules/addons/transports/http/httpserver/src/main/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineFactory.java
   stack/cxf/trunk/modules/addons/transports/http/httpserver/src/test/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineTest.java
Log:
[JBWS-3347] - Enhanced synchronization logic to specifically lock on the static portMap object.

Modified: stack/cxf/trunk/modules/addons/transports/http/httpserver/src/main/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineFactory.java
===================================================================
--- stack/cxf/trunk/modules/addons/transports/http/httpserver/src/main/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineFactory.java	2011-09-01 13:26:14 UTC (rev 14921)
+++ stack/cxf/trunk/modules/addons/transports/http/httpserver/src/main/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineFactory.java	2011-09-02 05:21:38 UTC (rev 14922)
@@ -36,7 +36,8 @@
 
 /**
  * A server engine factory for the JDK6-based httpserver engine
- * 
+ *
+ * @author Magesh Kumar B <mageshbk at jboss.com> (C) 2011 Red Hat Inc.
  * @author alessio.soldano at jboss.com
  * @since 19-Aug-2010
  *
@@ -85,24 +86,33 @@
     */
    public synchronized HttpServerEngine retrieveHttpServerEngine(int port)
    {
-      return portMap.get(port);
+      HttpServerEngine engine = null;
+      synchronized(portMap)
+      {
+         engine = portMap.get(port);
+      }
+      return engine;
    }
 
    public synchronized HttpServerEngine createHttpServerEngine(String host, int port, String protocol)
          throws IOException
    {
       LOG.fine("Creating HttpServer Engine for port " + port + ".");
-      HttpServerEngine ref = retrieveHttpServerEngine(port);
-      if (null == ref)
+      HttpServerEngine ref = null;
+      synchronized(portMap)
       {
-         ref = new HttpServerEngine(this, bus, host, port);
-         portMap.put(port, ref);
-      }
-      // checking the protocol    
-      if (!protocol.equals(ref.getProtocol()))
-      {
-         throw new IOException("Protocol mismatch for port " + port + ": " + "engine's protocol is "
+         ref = retrieveHttpServerEngine(port);
+         if (null == ref)
+         {
+            ref = new HttpServerEngine(this, bus, host, port);
+            portMap.put(port, ref);
+         }
+         // checking the protocol    
+         if (!protocol.equals(ref.getProtocol()))
+         {
+            throw new IOException("Protocol mismatch for port " + port + ": " + "engine's protocol is "
                + ref.getProtocol() + ", the url protocol is " + protocol);
+         }
       }
       return ref;
    }
@@ -112,18 +122,21 @@
     */
    public synchronized void destroyForPort(int port)
    {
-      HttpServerEngine ref = portMap.remove(port);
-      if (ref != null)
+      synchronized(portMap)
       {
-         LOG.fine("Stopping HttpServer Engine on port " + port + ".");
-         try
+         HttpServerEngine ref = portMap.remove(port);
+         if (ref != null)
          {
-            ref.stop();
+            LOG.fine("Stopping HttpServer Engine on port " + port + ".");
+            try
+            {
+               ref.stop();
+            }
+            catch (Exception e)
+            {
+               LOG.log(Level.WARNING, "", e);
+            }
          }
-         catch (Exception e)
-         {
-            LOG.log(Level.WARNING, "", e);
-         }
       }
    }
 

Modified: stack/cxf/trunk/modules/addons/transports/http/httpserver/src/test/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineTest.java
===================================================================
--- stack/cxf/trunk/modules/addons/transports/http/httpserver/src/test/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineTest.java	2011-09-01 13:26:14 UTC (rev 14921)
+++ stack/cxf/trunk/modules/addons/transports/http/httpserver/src/test/java/org/jboss/wsf/stack/cxf/addons/transports/httpserver/HttpServerEngineTest.java	2011-09-02 05:21:38 UTC (rev 14922)
@@ -25,27 +25,34 @@
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.Collections;
+import java.util.ArrayList;
+import java.util.List;
 
 import junit.framework.TestCase;
 
 import org.apache.cxf.Bus;
 import org.apache.cxf.configuration.Configurer;
 import org.apache.cxf.configuration.spring.ConfigurerImpl;
+import org.apache.cxf.service.model.EndpointInfo;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
 
 /**
  * Tests for HttpServerEngine
  * 
+ * @author Magesh Kumar B <mageshbk at jboss.com> (C) 2011 Red Hat Inc.
  * @author alessio.soldano at jboss.com
  * @since 20-Aug-2010
  *
  */
 public class HttpServerEngineTest extends TestCase {
 
+    private static final int THREAD_COUNT = 50;
     private Bus bus;
     private IMocksControl control;
     private HttpServerEngineFactory factory;
+    private static List<HttpServerEngine> servers = Collections.synchronizedList(new ArrayList<HttpServerEngine>());
 
     
    public void setUp() throws Exception
@@ -82,6 +89,39 @@
       control.verify();
    }
 
+   public void testMultiThreaded()
+   {
+      Thread threads[] = new Thread[THREAD_COUNT];
+      int i = 0;
+      // Initialize the threads
+      for (i = 0; i < THREAD_COUNT; i++)
+      {
+         threads[i] = new Thread(new FactoryInvoker());
+      }
+      // Start the threads
+      for (i = 0; i < THREAD_COUNT; i++)
+      {
+         threads[i].start();
+      }
+      // Wait for all threads to complete
+      while (servers.size() != THREAD_COUNT) {
+         try
+         {
+            Thread.sleep(100);
+         }
+         catch (InterruptedException ie)
+         {
+            // Ignore
+         }
+      }
+
+      HttpServerEngine sharedEngine = servers.get(0);
+      for (HttpServerEngine engine : servers)
+      {
+         assertEquals(sharedEngine, engine);
+      }
+   }
+
    public void testHandler() throws Exception
    {
       MyTestHandler handler1 = new MyTestHandler();
@@ -139,4 +179,37 @@
       }
    }
 
+   private class FactoryInvoker implements Runnable
+   {
+      private HttpServerEngineFactory _factory;
+
+      FactoryInvoker()
+      {
+         _factory = new HttpServerEngineFactory(null);
+      }
+
+      public void run()
+      {
+         HttpServerEngine engine = null;
+         try
+         {
+            // Delay makes sure the try blocks are initialized before calling createHttpServerEngine,
+            // enhances the chance to enter the createHttpServerEngine simultaneously.
+            try
+            {
+               Thread.sleep(10);
+            }
+            catch (InterruptedException ie)
+            {
+               // Ignore
+            }
+            engine = _factory.createHttpServerEngine("127.0.0.1", 18001, "http");
+         }
+         catch (Exception e)
+         {
+            e.printStackTrace();
+         }
+         servers.add(engine);
+      }
+   }
 }



More information about the jbossws-commits mailing list