code: public JobKey parseJobKey(byte[][] keyComponents) {
      // runId is inverted in the bytes representation so we get reverse
      // chronological order
      long encodedRunId = keyComponents.length > 3 ?
          Bytes.toLong(keyComponents[3]) : Long.MAX_VALUE;
  
      JobId jobId = keyComponents.length > 4 ?
          idConv.fromBytes(keyComponents[4]) : null;
  
      return new JobKey(Bytes.toString(keyComponents[0]),
          (keyComponents.length > 1 ? Bytes.toString(keyComponents[1]) : null),
          (keyComponents.length > 2 ? Bytes.toString(keyComponents[2]) : null),
          Long.MAX_VALUE - encodedRunId,
          jobId);
    }
docs: Constructs a JobKey instance from the individual byte encoded key
  components.
  
  @param keyComponents
  as split on
  @return a JobKey instance containing the decoded components