@Override
 public void callTimeout(final TimerImpl timer, final Method timeoutMethod) throws Exception {
   final EjbComponentInstance instance = acquireInstance();
   boolean discarded = false;
   try {
     instance.invokeTimeoutMethod(timeoutMethod, timer);
   } catch (Exception ex) {
     // Detect app exception
     if (ejbComponent.getApplicationException(ex.getClass(), timeoutMethod) != null) {
       // it's an application exception, just throw it back.
       throw ex;
     }
     if (ex instanceof ConcurrentAccessTimeoutException
         || ex instanceof ConcurrentAccessException) {
       throw ex;
     }
     if (ex instanceof RuntimeException || ex instanceof RemoteException) {
       discarded = true;
       if (pool != null) {
         pool.discard(instance);
       }
     }
     throw ex;
   } catch (final Error e) {
     discarded = true;
     if (pool != null) {
       pool.discard(instance);
     }
     throw e;
   } catch (final Throwable t) {
     discarded = true;
     if (pool != null) {
       pool.discard(instance);
     }
     throw new RuntimeException(t);
   } finally {
     if (!discarded) {
       releaseInstance(instance);
     }
   }
 }
 /**
  * Returns true if the passed <code>exceptionClass</code> is an application exception. Else
  * returns false.
  *
  * @param ejbComponent The EJB component
  * @param exceptionClass The exception class
  * @return
  */
 private boolean isApplicationException(
     final EJBComponent ejbComponent, final Class<?> exceptionClass, final Method invokedMethod) {
   return ejbComponent.getApplicationException(exceptionClass, invokedMethod) != null;
 }