docs: @Override
      public void doPortletAction(
              IPortletWindowId portletWindowId,
              HttpServletRequest request,
              HttpServletResponse response) {
          final long timeout = getPortletActionTimeout(portletWindowId, request);
  
          final IPortletExecutionWorker<Long> portletActionExecutionWorker =
                  this.portletWorkerFactory.createActionWorker(request, response, portletWindowId);
          portletActionExecutionWorker.submit();
  
          try {
              portletActionExecutionWorker.get(timeout);
          } catch (Exception e) {
              // put the exception into the error map for the session
              final Map<IPortletWindowId, Exception> portletFailureMap = getPortletErrorMap(request);
              portletFailureMap.put(portletWindowId, e);
          }
  
          // If the worker is still running add it to the hung-workers queue
          if (!portletActionExecutionWorker.isComplete()) {
              cancelWorker(request, portletActionExecutionWorker);
          }
  
          // Is this portlet permitted to emit events?  (Or is it disablePortletEvents=true?)
          final IPortletWindow portletWindow =
                  portletWindowRegistry.getPortletWindow(request, portletWindowId);
          IPortletDefinition portletDefinition =
                  portletWindow.getPortletEntity().getPortletDefinition();
          IPortletDefinitionParameter disablePortletEvents =
                  portletDefinition.getParameter(DISABLE_PORTLET_EVENTS_PARAMETER);
          if (disablePortletEvents != null && Boolean.parseBoolean(disablePortletEvents.getValue())) {
              logger.info(
                      "Ignoring portlet events for portlet '{}' because they have been disabled.",
                      portletDefinition.getFName());
          } else {
              // Proceed with events...
              final PortletEventQueue portletEventQueue =
                      this.eventCoordinationService.getPortletEventQueue(request);
              this.doPortletEvents(portletEventQueue, request, response);
          }
      }