code: public Object invoke(EJSDeployedSupport s, Timer timer) throws Exception {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
              Tr.debug(tc, "EJBinvoke(" + s.methodId + ":" +
                           s.methodInfo.getMethodName() + ")");
  
          // Get BeanO stored in EJSDeployedSupport during preInvoke processing and
          // use it to get a InvocationContext needed for invoking the AroundInvoke
          // or AroundTimeout interceptors (works for Session and MDB).
          ManagedBeanOBase beanO = (ManagedBeanOBase) s.beanO;
          InvocationContextImpl<?> invCtx = beanO.getInvocationContext();
          invCtx.setTimer(timer);
  
          // Invoke the around invoke interceptors, which will invoke the business method when
          // the last interceptor calls proceed on InvocationContext.
          EJBMethodInfoImpl methodInfo = s.methodInfo;
          return invCtx.doAroundInvoke(methodInfo.ivAroundInterceptors,
                                       methodInfo.ivMethod,
                                       s.ivEJBMethodArguments,
                                       s);
      }
docs: Invoke around invoke or around timer interceptors and then invoke the
  business or timer method. <p>
  
  Note, this method is used for both around invoke and around timeout on
  EJB 3.x session beans (Stateless, Stateful, or Singleton), but is only
  used for around timeout on message driven beans. <p>
  
  @param s is the same EJSDeployedSupport that was passed to the preInvoke method
  of this class.
  @param timer the timer, or <tt>null</tt> if this is not a timer method
  
  @return Object returned by business method invocation (which may be null
  if business method has void for return value).