Author: dblevins Date: Wed Jun 2 22:38:45 2010 New Revision: 950803 URL: http://svn.apache.org/viewvc?rev=950803&view=rev Log: svn merge -r 950800:950801 https://svn.apache.org/repos/asf/openejb/trunk/openejb3
http://svn.apache.org/viewvc?rev=950801&view=rev ------------------------------------------------------------------------ r950801 | dblevins | 2010-06-02 15:33:22 -0700 (Wed, 02 Jun 2010) | 4 lines OPENEJB-1289: Client connection pool timeouts events catchable as ConnectionPoolTimeoutException OPENEJB-1291: Stateless ConcurrentAccessTimeoutException OPENEJB-1290: Stateless @AccessTimeout ------------------------------------------------------------------------ Added: openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java - copied unchanged from r950801, openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java Modified: openejb/branches/openejb-3.1.x/ (props changed) openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java (props changed) openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInstanceManagerPoolingTest.java openejb/branches/openejb-3.1.x/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml (props changed) openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/MultithreadTest.java openejb/branches/openejb-3.1.x/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java Propchange: openejb/branches/openejb-3.1.x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Jun 2 22:38:45 2010 @@ -1,2 +1,2 @@ /openejb/branches/openejb-3.1.1:779593 -/openejb/trunk/openejb3:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391 +/openejb/trunk/openejb3:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801 Modified: openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java?rev=950803&r1=950802&r2=950803&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java (original) +++ openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java Wed Jun 2 22:38:45 2010 @@ -34,6 +34,7 @@ import java.io.IOException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; +import javax.ejb.ConcurrentAccessTimeoutException; import javax.naming.Context; import javax.naming.NamingException; import javax.xml.ws.WebServiceContext; @@ -43,6 +44,7 @@ import javax.management.MBeanServer; import org.apache.openejb.Injection; import org.apache.openejb.OpenEJBException; import org.apache.openejb.SystemException; +import org.apache.openejb.ApplicationException; import org.apache.openejb.monitoring.StatsInterceptor; import org.apache.openejb.monitoring.ObjectNameBuilder; import org.apache.openejb.monitoring.ManagedMBean; @@ -140,7 +142,10 @@ public class StatelessInstanceManager { instance.setPoolEntry(entry); } } catch (TimeoutException e) { - throw new IllegalStateException("An invocation of the Stateless Session Bean "+deploymentInfo.getEjbName()+" has timed-out"); + ConcurrentAccessTimeoutException timeoutException = new ConcurrentAccessTimeoutException("No instances available in Stateless Session Bean pool. Waited " + data.accessTimeout.toString()); + timeoutException.fillInStackTrace(); + + throw new ApplicationException(timeoutException); } catch (InterruptedException e) { Thread.interrupted(); throw new OpenEJBException("Unexpected Interruption of current thread: ", e); Propchange: openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Jun 2 22:38:45 2010 @@ -1,2 +1,2 @@ /openejb/branches/openejb-3.1.1/container/openejb-core/src/test/java/org/apache/openejb/config/UberInterfaceTest.java:779593 -/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391 +/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801 Modified: openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInstanceManagerPoolingTest.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInstanceManagerPoolingTest.java?rev=950803&r1=950802&r2=950803&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInstanceManagerPoolingTest.java (original) +++ openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/core/stateless/StatelessInstanceManagerPoolingTest.java Wed Jun 2 22:38:45 2010 @@ -23,6 +23,7 @@ import java.util.concurrent.atomic.Atomi import javax.ejb.Remote; import javax.ejb.Stateless; +import javax.ejb.ConcurrentAccessTimeoutException; import javax.naming.InitialContext; import javax.naming.NamingException; @@ -148,10 +149,9 @@ public class StatelessInstanceManagerPoo public void run(){ try{ counter.race(startingLine, startPistol); - }catch (Exception ex){ + }catch (ConcurrentAccessTimeoutException ex){ comment("Leap Start"); timeouts.countDown(); - assertEquals("An invocation of the Stateless Session Bean CounterBean has timed-out", ex.getMessage()); } } }; Propchange: openejb/branches/openejb-3.1.x/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Jun 2 22:38:45 2010 @@ -1,2 +1,2 @@ /openejb/branches/openejb-3.1.1/examples/alternate-descriptors/src/main/resources/META-INF/ejb-jar.xml:779593 -/openejb/trunk/openejb3/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391 +/openejb/trunk/openejb3/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801 Modified: openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java?rev=950803&r1=950802&r2=950803&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java Wed Jun 2 22:38:45 2010 @@ -26,6 +26,7 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.openejb.client.proxy.InvocationHandler; @@ -51,7 +52,7 @@ public abstract class EJBInvocationHandl protected transient boolean inProxyMap = false; - protected transient boolean isInvalidReference = false; + protected transient AtomicBoolean isInvalidReference = new AtomicBoolean(false); protected transient EJBRequest request; @@ -105,7 +106,7 @@ public abstract class EJBInvocationHandl } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - if (isInvalidReference) { + if (isInvalidReference.get()) { if (remote || java.rmi.Remote.class.isAssignableFrom(method.getDeclaringClass())){ throw new NoSuchObjectException("reference is invalid"); } else { @@ -145,12 +146,7 @@ public abstract class EJBInvocationHandl } protected void invalidateReference() { - this.server = null; - this.client = null; -// this.ejb = null; - this.inProxyMap = false; - this.isInvalidReference = true; - this.primaryKey = null; + this.isInvalidReference.set(true); } protected static void invalidateAllHandlers(Object key) { Modified: openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java?rev=950803&r1=950802&r2=950803&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java Wed Jun 2 22:38:45 2010 @@ -113,7 +113,7 @@ public abstract class EJBObjectHandler e return ejbObject; } - public synchronized Object _invoke(Object p, Method m, Object[] a) throws Throwable { + public Object _invoke(Object p, Method m, Object[] a) throws Throwable { Object retValue = null; /* @@ -179,8 +179,14 @@ public abstract class EJBObjectHandler e } } catch (Throwable oe) { if (remote) { + if (oe instanceof RemoteException) { + throw (RemoteException) oe; + } throw new RemoteException("Unknown Container Exception: " + oe.getClass().getName() + ": " + oe.getMessage(), getCause(oe)); } else { + if (oe instanceof EJBException) { + throw (EJBException) oe; + } throw new EJBException("Unknown Container Exception: " + oe.getClass().getName() + ": " + oe.getMessage()).initCause(getCause(oe)); } } Modified: openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java?rev=950803&r1=950802&r2=950803&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java Wed Jun 2 22:38:45 2010 @@ -28,8 +28,8 @@ import java.net.ConnectException; import java.net.Socket; import java.net.URI; import java.util.Map; -import java.util.Stack; import java.util.Properties; +import java.util.Stack; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -42,18 +42,29 @@ public class SocketConnectionFactory imp private static Map<URI, Pool> connections = new ConcurrentHashMap<URI, Pool>(); private int size = 5; - private int timeout = 120; + private long timeout = 1000; public SocketConnectionFactory() { + + size = getSize(); + timeout = getTimeout(); + } + + private long getTimeout() { Properties p = System.getProperties(); + long timeout = getLong(p, "openejb.client.connectionpool.timeout", this.timeout); + timeout = getLong(p, "openejb.client.connection.pool.timeout", timeout); + return timeout; + } - size = getInt(p, "openejb.client.connectionpool.size", size); + private int getSize() { + Properties p = System.getProperties(); + int size = getInt(p, "openejb.client.connectionpool.size", this.size); size = getInt(p, "openejb.client.connection.pool.size", size); - timeout = getInt(p, "openejb.client.connectionpool.timeout", timeout); - timeout = getInt(p, "openejb.client.connection.pool.timeout", timeout); + return size; } - public static int getInt(Properties p, String property, int defaultValue){ + public static int getInt(Properties p, String property, int defaultValue) { String value = p.getProperty(property); try { if (value != null) return Integer.parseInt(value); @@ -63,6 +74,16 @@ public class SocketConnectionFactory imp } } + public static long getLong(Properties p, String property, long defaultValue) { + String value = p.getProperty(property); + try { + if (value != null) return Long.parseLong(value); + else return defaultValue; + } catch (NumberFormatException e) { + return defaultValue; + } + } + public Connection getConnection(URI uri) throws java.io.IOException { Pool pool = getPool(uri); @@ -79,9 +100,10 @@ public class SocketConnectionFactory imp } try { - conn.lock.tryLock(60 * 5, TimeUnit.SECONDS); + conn.lock.tryLock(2, TimeUnit.SECONDS); } catch (InterruptedException e) { Thread.interrupted(); + pool.put(conn); throw new IOException("Connection busy"); } @@ -117,7 +139,7 @@ public class SocketConnectionFactory imp private Pool getPool(URI uri) { Pool pool = connections.get(uri); if (pool == null) { - pool = new Pool(size, timeout); + pool = new Pool(getSize(), getTimeout()); connections.put(uri, pool); } return pool; @@ -277,7 +299,7 @@ public class SocketConnectionFactory imp this.semaphore = new Semaphore(size); this.pool = new Stack<SocketConnection>(); this.timeout = timeout; - this.timeUnit = TimeUnit.SECONDS; + this.timeUnit = TimeUnit.MILLISECONDS; Object[] objects = new Object[size]; for (int i = 0; i < objects.length; i++) { @@ -294,7 +316,7 @@ public class SocketConnectionFactory imp Thread.interrupted(); } - throw new IllegalStateException("No connections available in pool (size " + size + "). Waited for " + timeout + " seconds for a connection."); + throw new ConnectionPoolTimeoutException("No connections available in pool (size " + size + "). Waited for " + timeout + " seconds for a connection."); } public void put(SocketConnection connection) { Modified: openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/MultithreadTest.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/MultithreadTest.java?rev=950803&r1=950802&r2=950803&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/MultithreadTest.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/MultithreadTest.java Wed Jun 2 22:38:45 2010 @@ -16,33 +16,173 @@ */ package org.apache.openejb.server.ejbd; +import junit.framework.TestCase; import org.apache.openejb.OpenEJB; +import org.apache.openejb.client.ConnectionPoolTimeoutException; +import org.apache.openejb.assembler.classic.Assembler; +import org.apache.openejb.assembler.classic.StatelessSessionContainerInfo; +import org.apache.openejb.config.ConfigurationFactory; +import org.apache.openejb.core.ServerFederation; import org.apache.openejb.jee.EjbJar; import org.apache.openejb.jee.StatelessBean; -import org.apache.openejb.config.ConfigurationFactory; import org.apache.openejb.loader.SystemInstance; -import org.apache.openejb.assembler.classic.Assembler; import org.apache.openejb.server.ServiceDaemon; import org.apache.openejb.server.ServicePool; -import org.apache.openejb.core.ServerFederation; +import javax.ejb.Remote; +import javax.ejb.Stateless; +import javax.ejb.ConcurrentAccessException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; -import javax.ejb.Remote; import java.util.Properties; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; - -import junit.framework.Assert; -import junit.framework.TestCase; +import java.util.concurrent.atomic.AtomicInteger; /** * @version $Rev$ $Date$ */ public class MultithreadTest extends TestCase { - public void test() throws Exception { + private ServiceDaemon serviceDaemon; + private Counter counter; + + private static CountDownLatch startPistol; + private static CountDownLatch startingLine; + private static CountDownLatch invocations; + + public void testStatelessBeanPooling() throws Exception { + + startPistol = new CountDownLatch(1); + startingLine = new CountDownLatch(10); + final CountDownLatch finishingLine = new CountDownLatch(30); + + // Do a business method... + Runnable r = new Runnable() { + public void run() { + counter.race(); + finishingLine.countDown(); + } + }; + + // -- READY -- + + // How much ever the no of client invocations the count should be 10 as only 10 instances will be created. + for (int i = 0; i < 30; i++) { + Thread t = new Thread(r); + t.start(); + } + + // Wait for the beans to reach the finish line + startingLine.await(1000, TimeUnit.MILLISECONDS); + + // -- SET -- + + assertEquals(10, CounterBean.instances.get()); + + // -- GO -- + + startPistol.countDown(); // go + + finishingLine.await(1000, TimeUnit.MILLISECONDS); + + // -- DONE -- + + assertEquals(10, CounterBean.instances.get()); + + } + + public void testStatelessBeanRelease() throws Exception { + + invocations = new CountDownLatch(30); + + // Do a business method... + Runnable r = new Runnable(){ + public void run(){ + try{ + counter.explode(); + }catch(Exception e){ + + } + } + }; + + // -- READY -- + + // 30 instances should be created and discarded. + for (int i = 0; i < 30; i++) { + Thread t = new Thread(r); + t.start(); + } + + boolean success = invocations.await(10000, TimeUnit.MILLISECONDS); + + assertTrue(success); + + assertEquals(30, CounterBean.discardedInstances.get()); + + } + + + public void testStatelessBeanTimeout() throws Exception { + + final CountDownLatch timeouts = new CountDownLatch(10); + startPistol = new CountDownLatch(1); + startingLine = new CountDownLatch(10); + + // Do a business method... + Runnable r = new Runnable(){ + public void run(){ + try{ + counter.race(); + }catch (ConcurrentAccessException ex){ + comment("Leap Start"); + timeouts.countDown(); + assertEquals("An invocation of the Stateless Session Bean CounterBean has timed-out", ex.getMessage()); + } catch (Throwable t) { + fail("Unexpected exception" + t.getClass().getName() + " " + t.getMessage()); + } + } + }; + + + comment("On your mark!"); + + for (int i = 0; i < 20; i++) { + Thread t = new Thread(r); + t.start(); + } + + // Wait for the beans to reach the start line + assertTrue("expected 10 invocations", startingLine.await(3000, TimeUnit.MILLISECONDS)); + + comment("Get Set!"); + + // Wait for the other beans timeout + assertTrue("expected 10 timeouts", timeouts.await(300000, TimeUnit.MILLISECONDS)); + + assertEquals(10, CounterBean.instances.get()); + + comment("Go!"); + + startPistol.countDown(); // go + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + serviceDaemon.stop(); + OpenEJB.destroy(); + } + + protected void setUp() throws Exception { + super.setUp(); + + int poolSize = 10; + + System.setProperty("openejb.client.connectionpool.size", "" + (poolSize*2)); + EjbServer ejbServer = new EjbServer(); KeepAliveServer keepAliveServer = new KeepAliveServer(ejbServer); @@ -52,95 +192,113 @@ public class MultithreadTest extends Tes OpenEJB.init(initProps, new ServerFederation()); ejbServer.init(new Properties()); - ServicePool pool = new ServicePool(keepAliveServer, "ejbd", 10); - ServiceDaemon serviceDaemon = new ServiceDaemon(pool, 0, "localhost"); + ServicePool pool = new ServicePool(keepAliveServer, "ejbd", (poolSize*2)); + this.serviceDaemon = new ServiceDaemon(pool, 0, "localhost"); serviceDaemon.start(); - try { + int port = serviceDaemon.getPort(); - int port = serviceDaemon.getPort(); + ConfigurationFactory config = new ConfigurationFactory(); + Assembler assembler = SystemInstance.get().getComponent(Assembler.class); - Assembler assembler = SystemInstance.get().getComponent(Assembler.class); - ConfigurationFactory config = new ConfigurationFactory(); + // containers + StatelessSessionContainerInfo statelessContainerInfo = config.configureService(StatelessSessionContainerInfo.class); + statelessContainerInfo.properties.setProperty("TimeOut", "100"); + statelessContainerInfo.properties.setProperty("PoolSize", "" + poolSize); + statelessContainerInfo.properties.setProperty("PoolMin", "2"); + statelessContainerInfo.properties.setProperty("StrictPooling", "true"); + assembler.createContainer(statelessContainerInfo); + + // Setup the descriptor information + + StatelessBean bean = new StatelessBean(CounterBean.class); + bean.addBusinessLocal(Counter.class.getName()); + bean.addBusinessRemote(RemoteCounter.class.getName()); + bean.addPostConstruct("init"); + bean.addPreDestroy("destroy"); + + EjbJar ejbJar = new EjbJar(); + ejbJar.addEnterpriseBean(bean); + + CounterBean.instances.set(0); + assembler.createApplication(config.configureApplication(ejbJar)); + + Properties props = new Properties(); + props.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory"); + props.put("java.naming.provider.url", "ejbd://127.0.0.1:" + port); + Context context = new InitialContext(props); + counter = (Counter) context.lookup("CounterBeanRemote"); + } - EjbJar ejbJar = new EjbJar(); - ejbJar.addEnterpriseBean(new StatelessBean(EchoBean.class)); - assembler.createApplication(config.configureApplication(ejbJar)); + public static Object lock = new Object[]{}; - // good creds + private static void comment(String x) { +// synchronized(lock){ +// System.out.println(x); +// System.out.flush(); +// } + } - int threads = 20; - CountDownLatch latch = new CountDownLatch(threads); + public static interface Counter { + int count(); - for (int i = 0; i < threads; i++) { - Client client = new Client(latch, i, port); - thread(client, false); - } + void race(); - assertTrue(latch.await(60, TimeUnit.SECONDS)); - } finally { - serviceDaemon.stop(); - OpenEJB.destroy(); - } + void explode(); } - public static void thread(Runnable runnable, boolean daemon) { - Thread thread = new Thread(runnable); - thread.setDaemon(daemon); - thread.start(); + @Remote + public static interface RemoteCounter extends Counter { + } - public static class Client implements Runnable { + @Stateless + public static class CounterBean implements Counter, RemoteCounter { - private final Echo echo; - private final CountDownLatch latch; - private final int id; + public static AtomicInteger instances = new AtomicInteger(); + public static AtomicInteger discardedInstances = new AtomicInteger(); - public Client(CountDownLatch latch, int i, int port) throws NamingException { - this.latch = latch; - this.id = i; + private int count; - Properties props = new Properties(); - props.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory"); - props.put("java.naming.provider.url", "ejbd://127.0.0.1:" + port +"?"+id); - Context context = new InitialContext(props); + public CounterBean() { + count = instances.incrementAndGet(); + } - this.echo = (Echo) context.lookup("EchoBeanRemote"); + public int count() { + return instances.get(); } - public void run() { + public int discardCount() { + return discardedInstances.get(); + } + public void explode() { try { - int count = 250; - for (; count >= 0; count--){ - String message = count + " bottles of beer on the wall"; - -// Thread.currentThread().setName("client-"+id+": "+count); - - String response = echo.echo(message); - Assert.assertEquals(message, reverse(response)); - } + discardedInstances.incrementAndGet(); + throw new NullPointerException(); } finally { - latch.countDown(); + invocations.countDown(); } } - private Object reverse(String s) { - return new StringBuilder(s).reverse().toString(); + public void race() { + comment("ready = " + count); + startingLine.countDown(); + try { + startPistol.await(); + comment("running = " + count); + } catch (InterruptedException e) { + Thread.interrupted(); + } } - } + public void init() { - public static class EchoBean implements Echo { - public String echo(String s) { -// System.out.println(s); - return new StringBuilder(s).reverse().toString(); } - } - @Remote - public static interface Echo { - public String echo(String s); + public void destroy() { + + } } } Modified: openejb/branches/openejb-3.1.x/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java?rev=950803&r1=950802&r2=950803&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-server/src/main/java/org/apache/openejb/server/ServiceDaemon.java Wed Jun 2 22:38:45 2010 @@ -53,7 +53,7 @@ public class ServiceDaemon implements Se private SocketListener socketListener; - private int timeout; + private int timeout = 1000; private InetAddress address; @@ -131,7 +131,7 @@ public class ServiceDaemon implements Se secure = options.get("secure", false); - timeout = 1000; + timeout = options.get("timeout", timeout); next.init(props); }
