code: public static void stopJob(String jobName, String key, String pValue)
        throws SundialSchedulerException {
  
      logger.debug("key= " + key);
      logger.debug("value= " + pValue);
      try {
        List<JobExecutionContext> currentlyExecutingJobs = getScheduler().getCurrentlyExecutingJobs();
        for (JobExecutionContext jobExecutionContext : currentlyExecutingJobs) {
          String currentlyExecutingJobName = jobExecutionContext.getJobDetail().getName();
          if (currentlyExecutingJobName.equals(jobName)) {
            if (jobExecutionContext.getJobInstance() instanceof Job) {
              JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
              String value = jobDataMap.getString(key);
              if (value != null & value.equalsIgnoreCase(pValue)) {
                ((Job) jobExecutionContext.getJobInstance()).interrupt();
              }
            } else {
              logger.warn("CANNOT STOP NON-INTERRUPTABLE JOB!!!");
            }
          } else {
            logger.debug("Non-matching Job found. Not Stopping!");
          }
        }
      } catch (SchedulerException e) {
        throw new SundialSchedulerException("ERROR DURING STOP JOB!!!", e);
      }
    }
docs: Triggers a Job interrupt on all Jobs matching the given Job Name, key and (String) value.
  Doesn't work if the value is not a String. The Job termination mechanism works by setting a
  flag that the Job should be terminated, but it is up to the logic in the Job to decide at what
  point termination should occur. Therefore, in any long-running job that you anticipate the need
  to terminate, put the method call checkTerminated() at an appropriate location.
  
  @param jobName The job name
  @param key The key in the job data map
  @param pValue The value in the job data map