pentaho/pentaho-kettle · error · KettleXMLException

JobEntryAbort.UnableToLoadFromXml.Label

Error message

JobEntryAbort.UnableToLoadFromXml.Label

What it means

JobEntryAbort.loadXML wraps exceptions from parsing the job entry's XML (<message> tag) into a KettleXMLException whose message is the localized key 'JobEntryAbort.UnableToLoadFromXml.Label'. It means the abort job entry could not be deserialized from the job XML.

Solutions

  1. Inspect and repair the <entry type='ABORT'> node in the .kjb (message tag)
  2. Restore the job file from backup/version control
  3. Recreate the abort entry in Spoon and re-save
  4. Check the cause chain in the log for the exact XML parse error

Example fix

// before (broken)
<entry type="ABORT"><message>Stopped</entery> <!-- malformed close tag -->
// after
<entry type="ABORT"><message>Stopped</message></entry>
Defensive patterns

Strategy: try-catch

Validate before calling

// validate ABORT entry node before load
Node entry = XMLHandler.getSubNode( jobNode, "entry" );
if ( XMLHandler.getTagValue( entry, "message" ) == null && !"ABORT".equals( XMLHandler.getTagValue( entry, "type" ) ) ) {
  throw new ValidationException( "Malformed ABORT entry node" );
}

Try / catch

try {
  entry.loadXML( node, databases, slaveServers, rep, metaStore );
} catch ( KettleXMLException e ) {
  logError( "Cannot load ABORT entry XML: " + e.getMessage(), e );
}

Prevention

When it happens

Trigger: loadXML called on a corrupt/malformed node for the ABORT entry — XMLHandler.getTagValue fails or super.loadXML throws while reading the entry node.

Common situations: Truncated or hand-edited .kjb file; encoding corruption; job produced by a tool that emitted invalid XML for this entry.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/17dfe08e9699f9c5. Report an issue: GitHub.

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/job/entries/abort/JobEntryAbort.java:85

    return je;
  }

  public String getXML() {
    StringBuilder retval = new StringBuilder();

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "message", messageAbort ) );

    return retval.toString();
  }

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      messageAbort = XMLHandler.getTagValue( entrynode, "message" );
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString( PKG, "JobEntryAbort.UnableToLoadFromXml.Label" ), e );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      messageAbort = rep.getJobEntryAttributeString( id_jobentry, "message" );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobEntryAbort.UnableToLoadFromRepo.Label", String
        .valueOf( id_jobentry ) ), dbe );
    }
  }

  // Save the attributes of this job entry
  //
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "message", messageAbort );

View on GitHub (pinned to f3058517a1)