[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