Author: dblevins Date: Fri Jun 4 23:08:37 2010 New Revision: 951612 URL: http://svn.apache.org/viewvc?rev=951612&view=rev Log: svn merge -r 951610:951611 https://svn.apache.org/repos/asf/openejb/trunk/openejb3
http://svn.apache.org/viewvc?rev=951611&view=rev ------------------------------------------------------------------------ r951611 | dblevins | 2010-06-04 16:07:20 -0700 (Fri, 04 Jun 2010) | 3 lines OPENEJB-1292: Client Failover on connection pool timeout OPENEJB-1293: Conditional Client Failover based on container or bean thrown Exception types ------------------------------------------------------------------------ Added: openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/RetryException.java - copied unchanged from r951611, openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RetryException.java openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FullPoolFailoverTest.java - copied unchanged from r951611, openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FullPoolFailoverTest.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/util/CountingLatch.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/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/Client.java openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.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/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java Propchange: openejb/branches/openejb-3.1.x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri Jun 4 23:08:37 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,950801 +/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,951611 Modified: openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java?rev=951612&r1=951611&r2=951612&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java (original) +++ openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java Fri Jun 4 23:08:37 2010 @@ -16,11 +16,7 @@ */ package org.apache.openejb.util; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.AbstractQueuedSynchronizer; -import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.TimeUnit; /** @@ -30,8 +26,12 @@ public class CountingLatch { private final Sync sync; - public CountingLatch() { - this.sync = new Sync(); + public CountingLatch() { + this(0); + } + + public CountingLatch(int count) { + this.sync = new Sync(count); } public void await() throws InterruptedException { @@ -55,8 +55,8 @@ public class CountingLatch { } private static final class Sync extends AbstractQueuedSynchronizer { - private Sync() { - setState(0); + private Sync(int count) { + setState(count); } public boolean tryReleaseShared(int releases) { Propchange: openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri Jun 4 23:08:37 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,950801 +/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,951611 Propchange: openejb/branches/openejb-3.1.x/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri Jun 4 23:08:37 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,950801 +/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,951611 Modified: openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java?rev=951612&r1=951611&r2=951612&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java Fri Jun 4 23:08:37 2010 @@ -18,6 +18,7 @@ package org.apache.openejb.client; import static org.apache.openejb.client.Exceptions.newIOException; +import javax.ejb.ConcurrentAccessTimeoutException; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; @@ -29,7 +30,9 @@ import java.rmi.RemoteException; import java.util.Map; import java.util.Set; import java.util.HashSet; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; import java.net.URI; @@ -41,14 +44,23 @@ public class Client { private static final ProtocolMetaData PROTOCOL_VERSION = new ProtocolMetaData("3.1"); + private List<Class<? extends Throwable>> retryConditions = new CopyOnWriteArrayList(); private static Client client = new Client(); private boolean retry = false; public Client() { - String retryValue = System.getProperty("openejb.client.requestretry", retry + ""); + String retryValue = System.getProperty("openejb.client.requestretry", getRetry() + ""); retry = new Boolean(retryValue); } + public static boolean addRetryCondition(Class<? extends Throwable> throwable) { + return client.retryConditions.add(throwable); + } + + public static boolean removeRetryCondition(Class<? extends Throwable> throwable) { + return client.retryConditions.remove(throwable); + } + // This lame hook point if only of testing public static void setClient(Client client) { Client.client = client; @@ -249,18 +261,32 @@ public class Client { throw new RemoteException("Error reading response from server (" + protocolMetaData.getSpec() + ") : " + e.getMessage(), e); } + if (retryConditions.size() > 0) { + if (res instanceof EJBResponse) { + EJBResponse ejbResponse = (EJBResponse) res; + if (ejbResponse.getResult() instanceof ThrowableArtifact) { + ThrowableArtifact artifact = (ThrowableArtifact) ejbResponse.getResult(); + if (retryConditions.contains(artifact.getThrowable().getClass())) { + throw new RetryException(res); + } + } + } + } } catch (RemoteException e) { throw e; } catch (IOException e){ Set<URI> failed = getFailed(); failed.add(conn.getURI()); conn.discard(); - if (retry){ + if (e instanceof RetryException || getRetry()){ try { processRequest(req, res, server); } catch (RemoteFailoverException re) { throw re; } catch (RemoteException re) { + if (e instanceof RetryException) { + return ((RetryException) e).getResponse(); + } throw new RemoteFailoverException("Cannot complete request. Retry attempted on " + failed.size() + " servers", e); } } @@ -304,4 +330,7 @@ public class Client { return cluster; } + private boolean getRetry() { + return retry = new Boolean(System.getProperty("openejb.client.requestretry", retry + "")); + } } Modified: openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java?rev=951612&r1=951611&r2=951612&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java Fri Jun 4 23:08:37 2010 @@ -16,12 +16,12 @@ */ package org.apache.openejb.client; -import javax.ejb.ConcurrentAccessException; +import java.io.IOException; /** * @version $Rev$ $Date$ */ -public class ConnectionPoolTimeoutException extends ConcurrentAccessException { +public class ConnectionPoolTimeoutException extends IOException { public ConnectionPoolTimeoutException() { } 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=951612&r1=951611&r2=951612&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 Fri Jun 4 23:08:37 2010 @@ -139,7 +139,7 @@ public class SocketConnectionFactory imp private Pool getPool(URI uri) { Pool pool = connections.get(uri); if (pool == null) { - pool = new Pool(getSize(), getTimeout()); + pool = new Pool(uri, getSize(), getTimeout()); connections.put(uri, pool); } return pool; @@ -287,14 +287,16 @@ public class SocketConnectionFactory imp } } - public static class Pool { + private static class Pool { private final Semaphore semaphore; private final Stack<SocketConnection> pool; private final long timeout; private final TimeUnit timeUnit; private final int size; + private final URI uri; - public Pool(int size, long timeout) { + private Pool(URI uri, int size, long timeout) { + this.uri = uri; this.size = size; this.semaphore = new Semaphore(size); this.pool = new Stack<SocketConnection>(); @@ -307,7 +309,7 @@ public class SocketConnectionFactory imp } } - public SocketConnection get() { + public SocketConnection get() throws IOException{ try { if (semaphore.tryAcquire(timeout, timeUnit)) { return pool.pop(); @@ -323,5 +325,14 @@ public class SocketConnectionFactory imp pool.push(connection); semaphore.release(); } + + @Override + public String toString() { + return "Pool{" + + "size=" + size + + ", available=" + semaphore.availablePermits() + + ", uri=" + uri + + '}'; + } } } Modified: openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java URL: http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java?rev=951612&r1=951611&r2=951612&view=diff ============================================================================== --- openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java (original) +++ openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java Fri Jun 4 23:08:37 2010 @@ -132,7 +132,7 @@ public class KeepAliveServer implements session.usage.unlock(); } } else { - logger.info("Allowing graceful shutdown of " + session.socket.getInetAddress()); + logger.debug("Allowing graceful shutdown of " + session.socket.getInetAddress()); } } }
