/** Checks to see if a worker has been retrieved (not orphaned) and if it is complete. */
  protected void checkWorkerCompletion(
      HttpServletRequest request, IPortletRenderExecutionWorker portletRenderExecutionWorker) {
    if (!portletRenderExecutionWorker.isRetrieved()) {
      final IPortletWindowId portletWindowId = portletRenderExecutionWorker.getPortletWindowId();
      final IPortletWindow portletWindow =
          this.portletWindowRegistry.getPortletWindow(request, portletWindowId);
      this.logger.warn(
          "Portlet worker started but never retrieved for {}, worker {}."
              + " If random portlet fnames it may be users switching tabs before page is done rendering"
              + " (would see separate log message with java.net.SocketException on socket write)."
              + " If repeatedly occurring with one portlet fname your theme layout xsl may not be including"
              + " a portlet present in your layout xml files (see"
              + " http://jasig.275507.n4.nabble.com/Portlet-worker-started-but-never-retrieved-td4580698.html)",
          portletWindow,
          portletRenderExecutionWorker);

      try {
        portletRenderExecutionWorker.get(0);
      } catch (Exception e) {
        // Ignore exception here, we just want to get this worker to complete
      }
    }

    if (!portletRenderExecutionWorker.isComplete()) {
      cancelWorker(request, portletRenderExecutionWorker);
    }
  }