code: private void doWork() {
          boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "doWork: " + ivTimer);
  
          TimedObjectWrapper timedObject;
          try {
              ivBeanId = ivBeanId.getInitializedBeanId(); // F743-506CodRev
          } catch (Exception ex) {
              FFDCFilter.processException(ex, CLASS_NAME + ".doWork", "247", this);
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "doWork: " + ex);
              throw ExceptionUtil.EJBException(ex);
          }
          EJSHome home = (EJSHome) ivBeanId.home;
  
          // Get the TimedObjectWrapper from the pool to execute the method.
          timedObject = home.getTimedObjectWrapper(ivBeanId);
  
          // Invoke ejbTimeout on the wrapper.  No need to handle exceptions,
          // as the wrapper will have already handled/mapped any exceptions
          // as expected.
          try {
              ivTimer.ivTimeoutThread = Thread.currentThread(); // d595255
              timedObject.invokeCallback(ivTimer, ivMethodId, false); // F743-506
          } finally {
              ivTimer.ivTimeoutThread = null; // d595255
              // Always return the TimedObjectWrapper to the pool.
              home.putTimedObjectWrapper(timedObject);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "doWork");
          }
      }
docs: Performs the work associated with the scheduled EJB Timer. <p>
  
  When the EJB Timer expires, this method will be called. A wrapper for
  the target TimedObject bean will be obtained, and the ejbTimeout method
  will be invoked. <p>
  
  The wrapper is similar to a generated Local wrapper, and will activate
  the bean as needed. It will also perform exception handling /
  mapping as required by the EJB Specification.