pentaho/pentaho-kettle · error · KettleException

ERROR_0003_Cannot_Save_Job_Entry

ERROR_0003_Cannot_Save_Job_Entry

Error message

JobEntryWebServiceAvailable.ERROR_0003_Cannot_Save_Job_Entry

What it means

KettleException (code ERROR_0003) thrown by JobEntryWebServiceAvailable.saveRep when persisting url/connectTimeOut/readTimeOut attributes fails with a KettleDatabaseException. The original DB error is chained and the job id included. Changes to the entry were not saved.

Solutions

  1. Check repository connectivity and write access
  2. Inspect the wrapped KettleDatabaseException for the specific SQL failure
  3. Verify attribute values fit repository column constraints
  4. Retry the save once the repository is healthy

Example fix

// before
entry.saveRep(rep, metaStore, idJob); // throws
// after
try {
  entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
  logError("Cannot save web-service-available entry: " + e.getCause(), e);
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (rep == null || idJob == null) throw new IllegalArgumentException("repository and id_job required");
// sanity-check url/timeouts before saving
if (url != null && url.length() > 2000) throw new IllegalArgumentException("url too long for repository column");

Try / catch

try {
  entry.saveRep(rep, metaStore, idJob);
} catch (KettleException e) {
  logError("SaveRep failed: " + e.getCause(), e);
}

Prevention

When it happens

Trigger: Calling saveRep with a repository that cannot write — DB down, read-only, constraint violation, or value exceeding column length.

Common situations: Saving a job during a repository outage; oversized timeout values or URLs; repository disk full; schema mismatch after upgrade.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/webserviceavailable/JobEntryWebServiceAvailable.java:111

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      url = rep.getJobEntryAttributeString( id_jobentry, "url" );
      connectTimeOut = rep.getJobEntryAttributeString( id_jobentry, "connectTimeOut" );
      readTimeOut = rep.getJobEntryAttributeString( id_jobentry, "readTimeOut" );
    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JobEntryWebServiceAvailable.ERROR_0002_Cannot_Load_Job_From_Repository", "" + id_jobentry ), dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "url", url );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "connectTimeOut", connectTimeOut );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "readTimeOut", readTimeOut );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JobEntryWebServiceAvailable.ERROR_0003_Cannot_Save_Job_Entry", "" + id_job ), dbe );
    }
  }

  public void setURL( String url ) {
    this.url = url;
  }

  public String getURL() {
    return url;
  }

  public void setConnectTimeOut( String timeout ) {
    this.connectTimeOut = timeout;
  }

  public String getConnectTimeOut() {
    return connectTimeOut;

View on GitHub (pinned to f3058517a1)