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
- Inspect and repair the <entry type='ABORT'> node in the .kjb (message tag)
- Restore the job file from backup/version control
- Recreate the abort entry in Spoon and re-save
- 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
- Validate .kjb XML after any manual edit
- Restore corrupt files from version control
- Keep authoring tooling versions consistent
- Check cause chain for exact XML parse errors
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
- JobEntryAddResultFilenames.UnableToLoadFromXml
- JobEntryCheckFilesLocked.UnableToLoadFromXml
- JobEntryColumnsExist.Meta.UnableLoadXml
- JobEntryConnectedToRepository.Meta.UnableToLoadFromXML
- JobEntryEval.UnableToLoadFromXml
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)