docs: @Override
      public void abandon(long executionId) throws NoSuchJobExecutionException, JobExecutionIsRunningException, JobSecurityException {
          batchRoleCheck();
  
          long jobInstanceId = getPersistenceManagerService().getJobInstanceIdFromExecutionId(executionId);
  
          if (authService != null) {
              authService.authorizedJobAbandonByInstance(jobInstanceId);
          }
  
          JobExecution jobEx = getPersistenceManagerService().getJobExecution(executionId);
  
          // if it is not in STARTED or STARTING state, mark it as ABANDONED
          List<BatchStatus> runningStatusesList = Arrays.asList(new BatchStatus[] { BatchStatus.STARTED, BatchStatus.STARTING });
          Set<BatchStatus> runningStatusesSet = Collections.unmodifiableSet(new HashSet<BatchStatus>(runningStatusesList));
  
          if (!runningStatusesSet.contains(jobEx.getBatchStatus())) {
              // update table to reflect ABANDONED state
              getPersistenceManagerService().updateJobExecutionAndInstanceOnStatusChange(jobEx.getExecutionId(), BatchStatus.ABANDONED, new Date());
              logger.fine("Job Execution: " + executionId + " was abandoned");
          } else {
              throw new JobExecutionIsRunningException("Job Execution: " + executionId + " is still running");
          }
  
          publishEvent((WSJobExecution) jobEx, BatchEventsPublisher.TOPIC_EXECUTION_ABANDONED);
      }