You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/05/17 15:12:12 UTC

svn commit: r1595470 - /tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/

Author: rmannibucau
Date: Sat May 17 13:12:11 2014
New Revision: 1595470

URL: http://svn.apache.org/r1595470
Log:
TOMEE-1212 reading thread and queue size from context and creating a local executorservice if needed + flushing tasks before quitting

Modified:
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandle.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeProxyHandle.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandle.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectProxyHandle.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBHomeHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBObjectHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBHomeHandler.java
    tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBObjectHandler.java

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandle.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandle.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandle.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandle.java Sat May 17 13:12:11 2014
@@ -21,6 +21,9 @@ import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.rmi.RemoteException;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class EJBHomeHandle implements java.io.Externalizable, javax.ejb.HomeHandle {
 
@@ -54,7 +57,15 @@ public class EJBHomeHandle implements ja
     @Override
     public void writeExternal(final ObjectOutput out) throws IOException {
         // write out the version of the serialized data for future use
-        out.writeByte(1);
+        out.writeByte(2);
+
+        final boolean hasExec = handler.executor != null && handler.executor != JNDIContext.globalExecutor();
+        out.writeBoolean(hasExec);
+        if (hasExec) {
+            out.writeInt(handler.executor.getMaximumPoolSize());
+            final BlockingQueue<Runnable> queue = handler.executor.getQueue();
+            out.writeInt(queue.size() + queue.remainingCapacity());
+        }
 
         handler.client.setMetaData(metaData);
         handler.client.writeExternal(out);
@@ -75,6 +86,20 @@ public class EJBHomeHandle implements ja
     public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
         final byte version = in.readByte(); // future use
 
+        ThreadPoolExecutor executorService;
+        if (version > 1) {
+            if (in.readBoolean()) {
+                final int queue = in.readInt();
+                final BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<Runnable>((queue < 2 ? 2 : queue));
+                final int threads = in.readInt();
+                executorService = JNDIContext.newExecutor(threads, blockingQueue);
+            } else {
+                executorService = null;
+            }
+        } else {
+            executorService = JNDIContext.globalExecutor();
+        }
+
         final ClientMetaData client = new ClientMetaData();
         final EJBMetaDataImpl ejb = new EJBMetaDataImpl();
         final ServerMetaData server = new ServerMetaData();
@@ -97,7 +122,7 @@ public class EJBHomeHandle implements ja
         server.setMetaData(metaData);
         server.readExternal(in);
 
-        handler = EJBHomeHandler.createEJBHomeHandler(ejb, server, client, null);
+        handler = EJBHomeHandler.createEJBHomeHandler(executorService, ejb, server, client, null);
         ejbHomeProxy = handler.createEJBHomeProxy();
     }
 

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java Sat May 17 13:12:11 2014
@@ -27,6 +27,7 @@ import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.concurrent.ThreadPoolExecutor;
 
 @SuppressWarnings("NullArgumentToVariableArgMethod")
 public abstract class EJBHomeHandler extends EJBInvocationHandler implements Externalizable {
@@ -39,15 +40,18 @@ public abstract class EJBHomeHandler ext
     @SuppressWarnings("RedundantArrayCreation")
     protected static final Method REMOVE_W_HAND = getMethod(EJBHome.class, "remove", new Class[]{Handle.class});
     protected static final Method GETHANDLER = getMethod(EJBHomeProxy.class, "getEJBHomeHandler", null);
+    protected ThreadPoolExecutor executor;
 
     public EJBHomeHandler() {
     }
 
-    public EJBHomeHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+    public EJBHomeHandler(final ThreadPoolExecutor executor, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
         super(ejb, server, client, auth);
+        this.executor = executor;
     }
 
-    public static EJBHomeHandler createEJBHomeHandler(final EJBMetaDataImpl ejb,
+    public static EJBHomeHandler createEJBHomeHandler(final ThreadPoolExecutor executor,
+                                                      final EJBMetaDataImpl ejb,
                                                       final ServerMetaData server,
                                                       final ClientMetaData client,
                                                       final JNDIContext.AuthenticationInfo auth) {
@@ -55,19 +59,19 @@ public abstract class EJBHomeHandler ext
             case EJBMetaDataImpl.BMP_ENTITY:
             case EJBMetaDataImpl.CMP_ENTITY:
 
-                return new EntityEJBHomeHandler(ejb, server, client, auth);
+                return new EntityEJBHomeHandler(executor, ejb, server, client, auth);
 
             case EJBMetaDataImpl.STATEFUL:
 
-                return new StatefulEJBHomeHandler(ejb, server, client, auth);
+                return new StatefulEJBHomeHandler(executor, ejb, server, client, auth);
 
             case EJBMetaDataImpl.STATELESS:
 
-                return new StatelessEJBHomeHandler(ejb, server, client, auth);
+                return new StatelessEJBHomeHandler(executor, ejb, server, client, auth);
 
             case EJBMetaDataImpl.SINGLETON:
 
-                return new SingletonEJBHomeHandler(ejb, server, client, auth);
+                return new SingletonEJBHomeHandler(executor, ejb, server, client, auth);
         }
 
         throw new IllegalStateException("Uknown bean type code '" + ejb.type + "' : " + ejb.toString());
@@ -223,7 +227,7 @@ public abstract class EJBHomeHandler ext
             case ResponseCodes.EJB_OK:
 
                 final Object primKey = res.getResult();
-                final EJBObjectHandler handler = EJBObjectHandler.createEJBObjectHandler(ejb, server, client, primKey, authenticationInfo);
+                final EJBObjectHandler handler = EJBObjectHandler.createEJBObjectHandler(executor, ejb, server, client, primKey, authenticationInfo);
                 handler.setEJBHomeProxy((EJBHomeProxy) proxy);
 
                 return handler.createEJBObjectProxy();

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeProxyHandle.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeProxyHandle.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeProxyHandle.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeProxyHandle.java Sat May 17 13:12:11 2014
@@ -21,6 +21,11 @@ import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.ObjectStreamException;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class EJBHomeProxyHandle implements Externalizable {
 
@@ -44,7 +49,15 @@ public class EJBHomeProxyHandle implemen
     @Override
     public void writeExternal(final ObjectOutput out) throws IOException {
         // write out the version of the serialized data for future use
-        out.writeByte(1);
+        out.writeByte(2);
+
+        final boolean hasExec = handler.executor != null && handler.executor != JNDIContext.globalExecutor();
+        out.writeBoolean(hasExec);
+        if (hasExec) {
+            out.writeInt(handler.executor.getMaximumPoolSize());
+            final BlockingQueue<Runnable> queue = handler.executor.getQueue();
+            out.writeInt(queue.size() + queue.remainingCapacity());
+        }
 
         handler.client.setMetaData(metaData);
         handler.client.writeExternal(out);
@@ -66,6 +79,20 @@ public class EJBHomeProxyHandle implemen
     public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
         final byte version = in.readByte(); // future use
 
+        ThreadPoolExecutor executorService;
+        if (version > 1) {
+            if (in.readBoolean()) {
+                final int queue = in.readInt();
+                final BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<Runnable>((queue < 2 ? 2 : queue));
+                final int threads = in.readInt();
+                executorService = JNDIContext.newExecutor(threads, blockingQueue);
+            } else {
+                executorService = null;
+            }
+        } else {
+            executorService = JNDIContext.globalExecutor();
+        }
+
         final ClientMetaData client = new ClientMetaData();
         final EJBMetaDataImpl ejb = new EJBMetaDataImpl();
         final ServerMetaData server = new ServerMetaData();
@@ -83,7 +110,7 @@ public class EJBHomeProxyHandle implemen
         server.setMetaData(metaData);
         server.readExternal(in);
 
-        handler = EJBHomeHandler.createEJBHomeHandler(ejb, server, client, /* TODO */ null);
+        handler = EJBHomeHandler.createEJBHomeHandler(executorService, ejb, server, client, /* TODO */ null);
     }
 
     private Object readResolve() throws ObjectStreamException {

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandle.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandle.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandle.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandle.java Sat May 17 13:12:11 2014
@@ -21,6 +21,9 @@ import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.rmi.RemoteException;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class EJBObjectHandle implements java.io.Externalizable, javax.ejb.Handle {
 
@@ -54,7 +57,15 @@ public class EJBObjectHandle implements 
     @Override
     public void writeExternal(final ObjectOutput out) throws IOException {
         // write out the version of the serialized data for future use
-        out.writeByte(1);
+        out.writeByte(2);
+
+        final boolean hasExec = handler.executor != null && handler.executor != JNDIContext.globalExecutor();
+        out.writeBoolean(hasExec);
+        if (hasExec) {
+            out.writeInt(handler.executor.getMaximumPoolSize());
+            final BlockingQueue<Runnable> queue = handler.executor.getQueue();
+            out.writeInt(queue.size() + queue.remainingCapacity());
+        }
 
         handler.client.setMetaData(metaData);
         handler.client.writeExternal(out);
@@ -77,6 +88,20 @@ public class EJBObjectHandle implements 
     public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
         final byte version = in.readByte(); // future use
 
+        ThreadPoolExecutor executorService;
+        if (version > 1) {
+            if (in.readBoolean()) {
+                final int queue = in.readInt();
+                final BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<Runnable>((queue < 2 ? 2 : queue));
+                final int threads = in.readInt();
+                executorService = JNDIContext.newExecutor(threads, blockingQueue);
+            } else {
+                executorService = null;
+            }
+        } else {
+            executorService = JNDIContext.globalExecutor();
+        }
+
         final ClientMetaData client = new ClientMetaData();
         final EJBMetaDataImpl ejb = new EJBMetaDataImpl();
         final ServerMetaData server = new ServerMetaData();
@@ -101,7 +126,7 @@ public class EJBObjectHandle implements 
 
         final Object primaryKey = in.readObject();
 
-        handler = EJBObjectHandler.createEJBObjectHandler(ejb, server, client, primaryKey, null);
+        handler = EJBObjectHandler.createEJBObjectHandler(executorService, ejb, server, client, primaryKey, null);
         ejbObjectProxy = handler.createEJBObjectProxy();
     }
 

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java Sat May 17 13:12:11 2014
@@ -31,24 +31,16 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.RejectedExecutionHandler;
-import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 @SuppressWarnings("NullArgumentToVariableArgMethod")
 public abstract class EJBObjectHandler extends EJBInvocationHandler {
-
-    public static final String OPENEJB_CLIENT_INVOKER_THREADS = "openejb.client.invoker.threads";
-    public static final String OPENEJB_CLIENT_INVOKER_QUEUE = "openejb.client.invoker.queue";
-
     protected static final Method GETEJBHOME = getMethod(EJBObject.class, "getEJBHome", null);
     protected static final Method GETHANDLE = getMethod(EJBObject.class, "getHandle", null);
     protected static final Method GETPRIMARYKEY = getMethod(EJBObject.class, "getPrimaryKey", null);
@@ -57,72 +49,6 @@ public abstract class EJBObjectHandler e
     protected static final Method GETHANDLER = getMethod(EJBObjectProxy.class, "getEJBObjectHandler", null);
     protected static final Method CANCEL = getMethod(Future.class, "cancel", boolean.class);
 
-    //TODO figure out how to configure and manage the thread pool on the client side, this will do for now...
-    private static final int threads = Integer.parseInt(System.getProperty(OPENEJB_CLIENT_INVOKER_THREADS, "10"));
-    private static final int queue = Integer.parseInt(System.getProperty(OPENEJB_CLIENT_INVOKER_QUEUE, "2"));
-    private static final LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<Runnable>((queue < 2 ? 2 : queue));
-
-    protected static final ThreadPoolExecutor executorService;
-
-    static {
-        /**
-         This thread pool starts with 3 core threads and can grow to the limit defined by 'threads'.
-         If a pool thread is idle for more than 1 minute it will be discarded, unless the core size is reached.
-         It can accept upto the number of processes defined by 'queue'.
-         If the queue is full then an attempt is made to add the process to the queue for 10 seconds.
-         Failure to add to the queue in this time will either result in a logged rejection, or if 'block'
-         is true then a final attempt is made to run the process in the current thread (the service thread).
-         */
-
-        executorService = new ThreadPoolExecutor(3, (threads < 3 ? 3 : threads), 1, TimeUnit.MINUTES, blockingQueue);
-        executorService.setThreadFactory(new ThreadFactory() {
-
-            private final AtomicInteger i = new AtomicInteger(0);
-
-            @Override
-            public Thread newThread(final Runnable r) {
-                final Thread t = new Thread(r, "OpenEJB.Client." + i.incrementAndGet());
-                t.setDaemon(true);
-                t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
-                    @Override
-                    public void uncaughtException(final Thread t, final Throwable e) {
-                        Logger.getLogger(EJBObjectHandler.class.getName()).log(Level.SEVERE, "Uncaught error in: " + t.getName(), e);
-                    }
-                });
-
-                return t;
-            }
-
-        });
-
-        executorService.setRejectedExecutionHandler(new RejectedExecutionHandler() {
-            @Override
-            public void rejectedExecution(final Runnable r, final ThreadPoolExecutor tpe) {
-
-                if (null == r || null == tpe || tpe.isShutdown() || tpe.isTerminated() || tpe.isTerminating()) {
-                    return;
-                }
-
-                final Logger log = Logger.getLogger(EJBObjectHandler.class.getName());
-
-                if (log.isLoggable(Level.WARNING)) {
-                    log.log(Level.WARNING, "EJBObjectHandler ExecutorService at capicity for process: " + r);
-                }
-
-                boolean offer = false;
-                try {
-                    offer = tpe.getQueue().offer(r, 10, TimeUnit.SECONDS);
-                } catch (InterruptedException e) {
-                    //Ignore
-                }
-
-                if (!offer) {
-                    log.log(Level.SEVERE, "EJBObjectHandler ExecutorService failed to run asynchronous process: " + r);
-                }
-            }
-        });
-    }
-
     /*
     * The registryId is a logical identifier that is used as a key when placing EntityEJBObjectHandler into
     * the BaseEjbProxyHanlder's liveHandleRegistry.  EntityEJBObjectHandlers that represent the same
@@ -136,26 +62,32 @@ public abstract class EJBObjectHandler e
 
     EJBHomeProxy ejbHome = null;
 
+    protected ThreadPoolExecutor executor = null;
+
     public EJBObjectHandler() {
     }
 
-    public EJBObjectHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+    public EJBObjectHandler(final ThreadPoolExecutor es, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
         super(ejb, server, client, null, auth);
+        this.executor = es;
     }
 
-    public EJBObjectHandler(final EJBMetaDataImpl ejb,
+    public EJBObjectHandler(final ThreadPoolExecutor es,
+                            final EJBMetaDataImpl ejb,
                             final ServerMetaData server,
                             final ClientMetaData client,
                             final Object primaryKey,
                             final JNDIContext.AuthenticationInfo auth) {
         super(ejb, server, client, primaryKey, auth);
+        this.executor = es;
     }
 
     protected void setEJBHomeProxy(final EJBHomeProxy ejbHome) {
         this.ejbHome = ejbHome;
     }
 
-    public static EJBObjectHandler createEJBObjectHandler(final EJBMetaDataImpl ejb,
+    public static EJBObjectHandler createEJBObjectHandler(final ThreadPoolExecutor executorService,
+                                                          final EJBMetaDataImpl ejb,
                                                           final ServerMetaData server,
                                                           final ClientMetaData client,
                                                           final Object primaryKey,
@@ -165,19 +97,19 @@ public abstract class EJBObjectHandler e
             case EJBMetaDataImpl.BMP_ENTITY:
             case EJBMetaDataImpl.CMP_ENTITY:
 
-                return new EntityEJBObjectHandler(ejb, server, client, primaryKey, auth);
+                return new EntityEJBObjectHandler(executorService, ejb, server, client, primaryKey, auth);
 
             case EJBMetaDataImpl.STATEFUL:
 
-                return new StatefulEJBObjectHandler(ejb, server, client, primaryKey, auth);
+                return new StatefulEJBObjectHandler(executorService, ejb, server, client, primaryKey, auth);
 
             case EJBMetaDataImpl.STATELESS:
 
-                return new StatelessEJBObjectHandler(ejb, server, client, primaryKey, auth);
+                return new StatelessEJBObjectHandler(executorService, ejb, server, client, primaryKey, auth);
 
             case EJBMetaDataImpl.SINGLETON:
 
-                return new SingletonEJBObjectHandler(ejb, server, client, primaryKey, auth);
+                return new SingletonEJBObjectHandler(executorService, ejb, server, client, primaryKey, auth);
         }
 
         throw new IllegalStateException("Uknown bean type code '" + ejb.type + "' : " + ejb.toString());
@@ -305,7 +237,7 @@ public abstract class EJBObjectHandler e
 
     protected Object getEJBHome(final Method method, final Object[] args, final Object proxy) throws Throwable {
         if (ejbHome == null) {
-            ejbHome = EJBHomeHandler.createEJBHomeHandler(ejb, server, client, authenticationInfo).createEJBHomeProxy();
+            ejbHome = EJBHomeHandler.createEJBHomeHandler(executor, ejb, server, client, authenticationInfo).createEJBHomeProxy();
         }
         return ejbHome;
     }
@@ -330,7 +262,10 @@ public abstract class EJBObjectHandler e
                 final String requestId = UUID.randomUUID().toString();
                 final EJBResponse response = new EJBResponse();
                 final AsynchronousCall asynchronousCall = new AsynchronousCall(method, args, proxy, requestId, response);
-                return new FutureAdapter(executorService.submit(asynchronousCall), response, requestId);
+                if (executor == null) {
+                    executor = JNDIContext.newExecutor(-1, null);
+                }
+                return new FutureAdapter(executor.submit(asynchronousCall), response, requestId);
             } catch (RejectedExecutionException e) {
                 throw new EJBException("failed to allocate internal resource to execute the target task", e);
             }
@@ -455,7 +390,7 @@ public abstract class EJBObjectHandler e
             if (canceled) {
                 return true;
             }
-            if (blockingQueue.remove(target)) {
+            if (executor.getQueue().remove(target)) {
                 // We successfully remove the task from the queue
                 canceled = true;
                 return true;

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectProxyHandle.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectProxyHandle.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectProxyHandle.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectProxyHandle.java Sat May 17 13:12:11 2014
@@ -21,6 +21,9 @@ import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.ObjectStreamException;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class EJBObjectProxyHandle implements Externalizable {
 
@@ -44,7 +47,15 @@ public class EJBObjectProxyHandle implem
     @Override
     public void writeExternal(final ObjectOutput out) throws IOException {
         // write out the version of the serialized data for future use
-        out.writeByte(1);
+        out.writeByte(2);
+
+        final boolean hasExec = handler.executor != null && handler.executor != JNDIContext.globalExecutor();
+        out.writeBoolean(hasExec);
+        if (hasExec) {
+            out.writeInt(handler.executor.getMaximumPoolSize());
+            final BlockingQueue<Runnable> queue = handler.executor.getQueue();
+            out.writeInt(queue.size() + queue.remainingCapacity());
+        }
 
         handler.client.setMetaData(metaData);
         handler.client.writeExternal(out);
@@ -63,6 +74,20 @@ public class EJBObjectProxyHandle implem
     public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
         final byte version = in.readByte(); // future use
 
+        ThreadPoolExecutor executorService;
+        if (version > 1) {
+            if (in.readBoolean()) {
+                final int queue = in.readInt();
+                final BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<Runnable>((queue < 2 ? 2 : queue));
+                final int threads = in.readInt();
+                executorService = JNDIContext.newExecutor(threads, blockingQueue);
+            } else {
+                executorService = null;
+            }
+        } else {
+            executorService = JNDIContext.globalExecutor();
+        }
+
         final ClientMetaData client = new ClientMetaData();
         final EJBMetaDataImpl ejb = new EJBMetaDataImpl();
         final ServerMetaData server = new ServerMetaData();
@@ -79,7 +104,7 @@ public class EJBObjectProxyHandle implem
 
         final JNDIContext.AuthenticationInfo authenticationInfo = JNDIContext.AuthenticationInfo.class.cast(in.readObject());
 
-        handler = EJBObjectHandler.createEJBObjectHandler(ejb, server, client, primaryKey, authenticationInfo);
+        handler = EJBObjectHandler.createEJBObjectHandler(executorService, ejb, server, client, primaryKey, authenticationInfo);
     }
 
     private Object readResolve() throws ObjectStreamException {

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java Sat May 17 13:12:11 2014
@@ -20,14 +20,15 @@ import javax.ejb.EJBObject;
 import javax.ejb.Handle;
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class EntityEJBHomeHandler extends EJBHomeHandler {
 
     public EntityEJBHomeHandler() {
     }
 
-    public EntityEJBHomeHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public EntityEJBHomeHandler(final ThreadPoolExecutor executor, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executor, ejb, server, client, auth);
     }
 
     @Override
@@ -53,7 +54,7 @@ public class EntityEJBHomeHandler extend
                 if (primKey == null) {
                     return null;
                 } else {
-                    handler = EJBObjectHandler.createEJBObjectHandler(ejb, server, client, primKey, authenticationInfo);
+                    handler = EJBObjectHandler.createEJBObjectHandler(executor, ejb, server, client, primKey, authenticationInfo);
                     handler.setEJBHomeProxy((EJBHomeProxy) proxy);
                     registerHandler(ejb.deploymentID + ":" + primKey, handler);
                     return handler.createEJBObjectProxy();
@@ -66,7 +67,7 @@ public class EntityEJBHomeHandler extend
                 for (int i = 0; i < primaryKeys.length; i++) {
                     primKey = primaryKeys[i];
                     if (primKey != null) {
-                        handler = EJBObjectHandler.createEJBObjectHandler(ejb, server, client, primKey, authenticationInfo);
+                        handler = EJBObjectHandler.createEJBObjectHandler(executor, ejb, server, client, primKey, authenticationInfo);
                         handler.setEJBHomeProxy((EJBHomeProxy) proxy);
                         registerHandler(ejb.deploymentID + ":" + primKey, handler);
                         primaryKeys[i] = handler.createEJBObjectProxy();
@@ -80,7 +81,7 @@ public class EntityEJBHomeHandler extend
                 for (int i = 0; i < primaryKeys.length; i++) {
                     primKey = primaryKeys[i];
                     if (primKey != null) {
-                        handler = EJBObjectHandler.createEJBObjectHandler(ejb, server, client, primKey, authenticationInfo);
+                        handler = EJBObjectHandler.createEJBObjectHandler(executor, ejb, server, client, primKey, authenticationInfo);
                         handler.setEJBHomeProxy((EJBHomeProxy) proxy);
                         registerHandler(ejb.deploymentID + ":" + primKey, handler);
                         primaryKeys[i] = handler.createEJBObjectProxy();

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java Sat May 17 13:12:11 2014
@@ -18,22 +18,24 @@ package org.apache.openejb.client;
 
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class EntityEJBObjectHandler extends EJBObjectHandler {
 
     public EntityEJBObjectHandler() {
     }
 
-    public EntityEJBObjectHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public EntityEJBObjectHandler(final ThreadPoolExecutor executorService, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executorService, ejb, server, client, auth);
     }
 
-    public EntityEJBObjectHandler(final EJBMetaDataImpl ejb,
+    public EntityEJBObjectHandler(final ThreadPoolExecutor executorService,
+                                  final EJBMetaDataImpl ejb,
                                   final ServerMetaData server,
                                   final ClientMetaData client,
                                   final Object primaryKey,
                                   final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, primaryKey, auth);
+        super(executorService, ejb, server, client, primaryKey, auth);
         registryId = ejb.deploymentID + ":" + primaryKey;
         registerHandler(registryId, this);
     }

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java Sat May 17 13:12:11 2014
@@ -48,16 +48,30 @@ import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * @version $Rev$ $Date$
  */
 @SuppressWarnings("UseOfObsoleteCollectionType")
 public class JNDIContext implements InitialContextFactory, Context {
+    private static final Logger LOGGER = Logger.getLogger("OpenEJB.client");
 
     public static final String DEFAULT_PROVIDER_URL = "ejbd://localhost:4201";
     public static final String SERIALIZER = "openejb.ejbd.serializer";
     public static final String AUTHENTICATE_WITH_THE_REQUEST = "openejb.ejbd.authenticate-with-request";
+    public static final String POOL_QUEUE_SIZE = "openejb.client.invoker.queue";
+    public static final String POOL_THREAD_NUMBER = "openejb.client.invoker.threads";
 
     private String tail = "/";
     private ServerMetaData server;
@@ -66,8 +80,115 @@ public class JNDIContext implements Init
     private String moduleId;
     private ClientInstance clientIdentity;
 
+    private static final ThreadPoolExecutor GLOBAL_CLIENT_POOL = newExecutor(10, null);
+    static {
+        ClassLoader classLoader = Client.class.getClassLoader();
+        Class<?> container;
+        try {
+            container = Class.forName("org.apache.openejb.OpenEJB", false, classLoader);
+        } catch (final Throwable e) {
+            container = null;
+        }
+        if (classLoader == ClassLoader.getSystemClassLoader() || Boolean.getBoolean("openejb.client.flus-tasks")
+                || (container != null && container.getClassLoader() == classLoader)) {
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+                @Override
+                public void run() {
+                    waitEndOfTasks(GLOBAL_CLIENT_POOL);
+                }
+            });
+        }
+    }
+
     private AuthenticationInfo authenticationInfo = null;
 
+    //TODO figure out how to configure and manage the thread pool on the client side, this will do for now...
+    private transient int threads;
+    private transient LinkedBlockingQueue<Runnable> blockingQueue;
+
+    protected transient ThreadPoolExecutor executorService;
+
+    public static ThreadPoolExecutor globalExecutor() {
+        return GLOBAL_CLIENT_POOL;
+    }
+
+    private ThreadPoolExecutor executor() {
+        if (executorService != null) {
+            return executorService;
+        }
+        if (threads < 0) {
+            return GLOBAL_CLIENT_POOL;
+        }
+        synchronized (this) {
+            if (executorService != null) {
+                return executorService;
+            }
+            executorService = newExecutor(threads, blockingQueue);
+        }
+        return executorService;
+    }
+
+    public static ThreadPoolExecutor newExecutor(final int threads, final BlockingQueue<Runnable> blockingQueue)
+    {
+        /**
+         This thread pool starts with 3 core threads and can grow to the limit defined by 'threads'.
+         If a pool thread is idle for more than 1 minute it will be discarded, unless the core size is reached.
+         It can accept upto the number of processes defined by 'queue'.
+         If the queue is full then an attempt is made to add the process to the queue for 10 seconds.
+         Failure to add to the queue in this time will either result in a logged rejection, or if 'block'
+         is true then a final attempt is made to run the process in the current thread (the service thread).
+         */
+
+        final ThreadPoolExecutor executorService = new ThreadPoolExecutor(3, (threads < 3 ? 3 : threads), 1, TimeUnit.MINUTES, blockingQueue == null ? new LinkedBlockingDeque<Runnable>(Integer.parseInt(getProperty(null, POOL_QUEUE_SIZE, "2"))) : blockingQueue);
+        executorService.setThreadFactory(new ThreadFactory() {
+
+            private final AtomicInteger i = new AtomicInteger(0);
+
+            @Override
+            public Thread newThread(final Runnable r) {
+                final Thread t = new Thread(r, "OpenEJB.Client." + i.incrementAndGet());
+                t.setDaemon(true);
+                t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+                    @Override
+                    public void uncaughtException(final Thread t, final Throwable e) {
+                        Logger.getLogger(EJBObjectHandler.class.getName()).log(Level.SEVERE, "Uncaught error in: " + t.getName(), e);
+                    }
+                });
+
+                return t;
+            }
+
+        });
+
+        executorService.setRejectedExecutionHandler(new RejectedExecutionHandler() {
+            @Override
+            public void rejectedExecution(final Runnable r, final ThreadPoolExecutor tpe) {
+
+                if (null == r || null == tpe || tpe.isShutdown() || tpe.isTerminated() || tpe.isTerminating()) {
+                    return;
+                }
+
+                final Logger log = Logger.getLogger(EJBObjectHandler.class.getName());
+
+                if (log.isLoggable(Level.WARNING)) {
+                    log.log(Level.WARNING, "EJBObjectHandler ExecutorService at capicity for process: " + r);
+                }
+
+                boolean offer = false;
+                try {
+                    offer = tpe.getQueue().offer(r, 10, TimeUnit.SECONDS);
+                } catch (InterruptedException e) {
+                    //Ignore
+                }
+
+                if (!offer) {
+                    log.log(Level.SEVERE, "EJBObjectHandler ExecutorService failed to run asynchronous process: " + r);
+                }
+            }
+        });
+        return executorService;
+    }
+
     public JNDIContext() {
     }
 
@@ -156,9 +277,22 @@ public class JNDIContext implements Init
             }
         }
 
+        final int queue = Integer.parseInt(getProperty(env, JNDIContext.POOL_QUEUE_SIZE, "2"));
+        blockingQueue = new LinkedBlockingQueue<Runnable>((queue < 2 ? 2 : queue));
+        threads = Integer.parseInt(getProperty(env, "openejb.client.invoker.threads", "-1"));
+
         return this;
     }
 
+    private static String getProperty(final Hashtable env, final String key, final String defaultValue)
+    {
+        Object value = env == null ? null : env.get(key);
+        if (value != null) {
+            return value.toString();
+        }
+        return System.getProperty(key, defaultValue);
+    }
+
     /**
      * Add missing parts - expected only part of the required providerUrl
      * <p/>
@@ -217,7 +351,7 @@ public class JNDIContext implements Init
     }
 
     public EJBHomeProxy createEJBHomeProxy(final EJBMetaDataImpl ejbData) {
-        final EJBHomeHandler handler = EJBHomeHandler.createEJBHomeHandler(ejbData, server, client, authenticationInfo);
+        final EJBHomeHandler handler = EJBHomeHandler.createEJBHomeHandler(executor(), ejbData, server, client, authenticationInfo);
         final EJBHomeProxy proxy = handler.createEJBHomeProxy();
         handler.ejb.ejbHomeProxy = proxy;
 
@@ -229,7 +363,7 @@ public class JNDIContext implements Init
         final EJBMetaDataImpl ejb = (EJBMetaDataImpl) result;
         final Object primaryKey = ejb.getPrimaryKey();
 
-        final EJBObjectHandler handler = EJBObjectHandler.createEJBObjectHandler(ejb, server, client, primaryKey, authenticationInfo);
+        final EJBObjectHandler handler = EJBObjectHandler.createEJBObjectHandler(executor(), ejb, server, client, primaryKey, authenticationInfo);
         return handler.createEJBObjectProxy();
     }
 
@@ -574,6 +708,23 @@ public class JNDIContext implements Init
 
     @Override
     public void close() throws NamingException {
+        waitEndOfTasks(executorService);
+    }
+
+    private static void waitEndOfTasks(final ExecutorService executor)
+    {
+        if (executor == null) {
+            return;
+        }
+
+        final List<Runnable> runnables = executor.shutdownNow();
+        for (final Runnable r : runnables) {
+            try {
+                r.run();
+            } catch (final Throwable th) {
+                LOGGER.log(Level.SEVERE, th.getMessage(), th);
+            }
+        }
     }
 
     @Override

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBHomeHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBHomeHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBHomeHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBHomeHandler.java Sat May 17 13:12:11 2014
@@ -18,14 +18,15 @@ package org.apache.openejb.client;
 
 import javax.ejb.RemoveException;
 import java.lang.reflect.Method;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class SingletonEJBHomeHandler extends EJBHomeHandler {
 
     public SingletonEJBHomeHandler() {
     }
 
-    public SingletonEJBHomeHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public SingletonEJBHomeHandler(final ThreadPoolExecutor executor, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executor, ejb, server, client, auth);
     }
 
     @Override
@@ -44,7 +45,7 @@ public class SingletonEJBHomeHandler ext
         return null;
     }
 
-    protected EJBObjectHandler newEJBObjectHandler() {
+    protected EJBObjectHandler newEJBObjectHandler() { // shouldn't be called
         return new SingletonEJBObjectHandler();
     }
 

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBObjectHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBObjectHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBObjectHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/SingletonEJBObjectHandler.java Sat May 17 13:12:11 2014
@@ -18,6 +18,8 @@ package org.apache.openejb.client;
 
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class SingletonEJBObjectHandler extends EJBObjectHandler {
 
@@ -26,16 +28,17 @@ public class SingletonEJBObjectHandler e
     public SingletonEJBObjectHandler() {
     }
 
-    public SingletonEJBObjectHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public SingletonEJBObjectHandler(final ThreadPoolExecutor executorService, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executorService, ejb, server, client, auth);
     }
 
-    public SingletonEJBObjectHandler(final EJBMetaDataImpl ejb,
+    public SingletonEJBObjectHandler(final ThreadPoolExecutor executorService,
+                                     final EJBMetaDataImpl ejb,
                                      final ServerMetaData server,
                                      final ClientMetaData client,
                                      final Object primaryKey,
                                      final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, primaryKey, auth);
+        super(executorService, ejb, server, client, primaryKey, auth);
     }
 
     public static Object createRegistryId(final Object primKey, final Object deployId, final String containerID) {

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java Sat May 17 13:12:11 2014
@@ -19,14 +19,15 @@ package org.apache.openejb.client;
 import javax.ejb.RemoveException;
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class StatefulEJBHomeHandler extends EJBHomeHandler {
 
     public StatefulEJBHomeHandler() {
     }
 
-    public StatefulEJBHomeHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public StatefulEJBHomeHandler(final ThreadPoolExecutor executor, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executor, ejb, server, client, auth);
     }
 
     @Override

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java Sat May 17 13:12:11 2014
@@ -18,22 +18,25 @@ package org.apache.openejb.client;
 
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class StatefulEJBObjectHandler extends EJBObjectHandler {
 
     public StatefulEJBObjectHandler() {
     }
 
-    public StatefulEJBObjectHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public StatefulEJBObjectHandler(final ThreadPoolExecutor executorService, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executorService, ejb, server, client, auth);
     }
 
-    public StatefulEJBObjectHandler(final EJBMetaDataImpl ejb,
+    public StatefulEJBObjectHandler(final ThreadPoolExecutor executorService,
+                                    final EJBMetaDataImpl ejb,
                                     final ServerMetaData server,
                                     final ClientMetaData client,
                                     final Object primaryKey,
                                     final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, primaryKey, auth);
+        super(executorService, ejb, server, client, primaryKey, auth);
         registerHandler(primaryKey, this);
     }
 

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBHomeHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBHomeHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBHomeHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBHomeHandler.java Sat May 17 13:12:11 2014
@@ -18,14 +18,15 @@ package org.apache.openejb.client;
 
 import javax.ejb.RemoveException;
 import java.lang.reflect.Method;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class StatelessEJBHomeHandler extends EJBHomeHandler {
 
     public StatelessEJBHomeHandler() {
     }
 
-    public StatelessEJBHomeHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public StatelessEJBHomeHandler(final ThreadPoolExecutor executor, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executor, ejb, server, client, auth);
     }
 
     @Override

Modified: tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBObjectHandler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBObjectHandler.java?rev=1595470&r1=1595469&r2=1595470&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBObjectHandler.java (original)
+++ tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatelessEJBObjectHandler.java Sat May 17 13:12:11 2014
@@ -18,6 +18,8 @@ package org.apache.openejb.client;
 
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
 
 public class StatelessEJBObjectHandler extends EJBObjectHandler {
 
@@ -26,16 +28,17 @@ public class StatelessEJBObjectHandler e
     public StatelessEJBObjectHandler() {
     }
 
-    public StatelessEJBObjectHandler(final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, auth);
+    public StatelessEJBObjectHandler(final ThreadPoolExecutor executorService, final EJBMetaDataImpl ejb, final ServerMetaData server, final ClientMetaData client, final JNDIContext.AuthenticationInfo auth) {
+        super(executorService, ejb, server, client, auth);
     }
 
-    public StatelessEJBObjectHandler(final EJBMetaDataImpl ejb,
+    public StatelessEJBObjectHandler(final ThreadPoolExecutor executorService,
+                                     final EJBMetaDataImpl ejb,
                                      final ServerMetaData server,
                                      final ClientMetaData client,
                                      final Object primaryKey,
                                      final JNDIContext.AuthenticationInfo auth) {
-        super(ejb, server, client, primaryKey, auth);
+        super(executorService, ejb, server, client, primaryKey, auth);
     }
 
     public static Object createRegistryId(final Object primKey, final Object deployId, final String containerID) {