docs: public void invokeCallback(Timer timer, int methodId, boolean persistentGlobalTx)
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.entry(tc, "invokeCallback: " + timer);
  
          EJSDeployedSupport s = new EJSDeployedSupport();
          s.isPersistentTimeoutGlobalTx = persistentGlobalTx; // RTC126471
          try
          {
              // The 'TimedObject' wrapper now uses the EJB 3.0 style preInvoke,
              // to support POJOs that implement TimedObject.               d438133.1
  
              EJBMethodInfoImpl methodInfo = methodInfos[methodId];
              Object[] args = (methodInfo.ivNumberOfMethodParms == 1) ? new Object[] { timer } : new Object[0]; //F743-15870
              Object timedObj = container.EjbPreInvoke(this, methodId, s, args); // F743-506
  
              if (methodInfo.getAroundInterceptorProxies() != null) // F743-17763, F743-17763.1
              {
                  container.invoke(s, timer);
              }
              else
              {
                  // If the EJB implements TimedObject, then the 'ejbTimeout' method is
                  // invoked directly (better performance); otherwise, reflections is
                  // used to call the user specified 'timeout' method.          d438133.2
                  // F743-506 - This optimization is only relevant for programmatically
                  // created timers.
                  if (methodId == 0 && bmd.isTimedObject && bmd.ivTimeoutMethod == null)
                  {
                      ((TimedObject) timedObj).ejbTimeout(timer);
                  }
                  else
                  {
                      s.methodInfo.ivMethod.invoke(timedObj, args);
                  }
              }
          } catch (InvocationTargetException itex)
          {
              // All exceptions are considered Unchecked Exceptions
              Throwable targetEx = itex.getCause();
              if (targetEx == null)
                  targetEx = itex;
              s.setUncheckedLocalException(targetEx);
          } catch (Throwable ex)
          {
              // All exceptions are considered Unchecked Exceptions
              FFDCFilter.processException(ex, CLASS_NAME + ".invokeCallback", "83", this);
              s.setUncheckedLocalException(ex);
          } finally
          {
              try
              {
                  container.postInvoke(this, methodId, s); // F743-506
              } catch (RemoteException rex)
              {
                  // This should never occur, but must be caught, since
                  // RemoteException is on the throws clause of postInvoke.
                  FFDCFilter.processException(rex, CLASS_NAME + ".invokeCallback",
                                              "91", this);
                  s.setUncheckedLocalException(rex);
              } finally
              {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      Tr.exit(tc, "invokeCallback");
              }
          }
          return;
      }