pentaho/pentaho-kettle · error · KettleException
Unable to save job entry of type 'ftp' to the repository…
Error message
Unable to save job entry of type 'ftp' to the repository for id_job={} What it means
This KettleException is thrown by HL7MLLPInput.saveRep() when one of the rep.saveJobEntryAttribute() calls fails while persisting this HL7 MLLP Input job entry's configuration (server, port, and variable names) to the Kettle repository. The underlying KettleDatabaseException is wrapped and rethrown with the job entry type and id_job for context. The 'ftp' text is a copy-paste artifact from another job entry and does not indicate FTP is involved.
Solutions
- Verify the repository database connection is alive and retry the save
- Check the r_jobentry_attribute table exists and has the expected schema for this Kettle version
- Re-open the job and re-save to refresh the id_job reference
- Check repository DB logs for the wrapped KettleDatabaseException cause for the exact SQL failure
Example fix
// before throw new KettleException( "Unable to save job entry of type 'ftp' to the repository for id_job=" + id_job, dbe ); // after throw new KettleException( "Unable to save job entry of type 'HL7 MLLP Input' to the repository for id_job=" + id_job, dbe );
Defensive patterns
Strategy: try-catch
Validate before calling
if (jobEntry.getObjectId() == null || rep == null) { throw new IllegalStateException("Job entry not persisted yet; cannot saveRep"); } Try / catch
try { jobEntry.saveRep(rep, metaStore, id_job); } catch (KettleException e) { logError("Repository save failed for id_job=" + id_job, e); throw e; } Prevention
- Keep the repository connection healthy before bulk job saves
- Monitor repository DB connectivity; retry saves on transient failures
- Keep r_jobentry_attribute schema in sync with the Kettle version
- Note the misleading 'ftp' text — always read the wrapped cause for the real error
When it happens
Trigger: saveRep() is invoked (e.g. saving a job in Spoon) and the repository database throws a KettleDatabaseException while writing any of the server/port/message_variable/type_variable/version_version_variable attributes — e.g. repository connection lost, table missing/corrupt, or id_job no longer valid.
Common situations: Repository database is down or network to it dropped mid-save; r_jobentry_attribute table schema mismatch after a Kettle upgrade; stale/deleted id_job reference; repository metadata cache out of sync.
Related errors
- JobEntryCheckFilesLocked.UnableToLoadFromRepo
- JobEntryCheckFilesLocked.UnableToSaveToRepo
- JobEntryColumnsExist.Meta.UnableLoadRep
- JobEntryColumnsExist.Meta.UnableSaveRep
- JobEntryEval.UnableToLoadFromRepo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/416ba45bf80bc4a1.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/hl7/core/src/main/java/org/pentaho/di/job/entries/hl7mllpin/HL7MLLPInput.java:136
server = rep.getJobEntryAttributeString( idJobentry, "server" );
port = rep.getJobEntryAttributeString( idJobentry, "port" );
messageVariableName = rep.getJobEntryAttributeString( idJobentry, "message_variable" );
messageTypeVariableName = rep.getJobEntryAttributeString( idJobentry, "type_variable" );
versionVariableName = rep.getJobEntryAttributeString( idJobentry, "version_variable" );
} catch ( KettleException dbe ) {
throw new KettleException( "Unable to load job entry from the repository for id_jobentry=" + idJobentry, dbe );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "server", server );
rep.saveJobEntryAttribute( id_job, getObjectId(), "port", port );
rep.saveJobEntryAttribute( id_job, getObjectId(), "message_variable", messageVariableName );
rep.saveJobEntryAttribute( id_job, getObjectId(), "type_variable", messageTypeVariableName );
rep.saveJobEntryAttribute( id_job, getObjectId(), "version_variable", versionVariableName );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "Unable to save job entry of type 'ftp' to the repository for id_job=" + id_job, dbe );
}
}
public Result execute( Result previousResult, int nr ) {
Result result = previousResult;
try {
String serverName = environmentSubstitute( server );
int portNumber = Integer.parseInt( environmentSubstitute( port ) );
String messageVariable = environmentSubstitute( messageVariableName );
String messageTypeVariable = environmentSubstitute( messageTypeVariableName );
String versionVariable = environmentSubstitute( versionVariableName );
MLLPSocketCacheEntry entry = MLLPSocketCache.getInstance().getServerSocketStreamSource( serverName, portNumber );
if ( entry.getJobListener() != null ) {
parentJob.addJobListener( entry.getJobListener() );
}View on GitHub (pinned to f3058517a1)