pentaho/pentaho-kettle · error · KettleException

Unable to load job entry of type 'Msgbox Info' from the…

Error message

Unable to load job entry of type 'Msgbox Info' from the repository with id_jobentry=

What it means

JobEntryMsgBoxInfo.loadRep() wraps a KettleDatabaseException raised while reading the 'bodymessage' and 'titremessage' attributes for a given id_jobentry from the Kettle repository into a KettleException with this message (the id is appended). It means the repository database could not serve the stored attributes for this 'Msgbox Info' job entry row.

Solutions

  1. Check the nested KettleDatabaseException cause for the underlying SQL error and fix the DB connectivity/schema issue.
  2. Verify id_jobentry exists: SELECT from r_jobentry / r_jobentry_attribute for that id.
  3. Run the repository upgrade/repair scripts matching your Kettle version (e.g. via the repository connect wizard).
  4. Restore the repository database from backup or recreate the job entry and re-save it to the repository.

Example fix

// before: querying with a stale/deleted id
jobEntry.loadRep(rep, metaStore, staleId, databases, slaveServers);
// after: verify the row exists first
if (rep.getJobEntryAttributeInteger(staleId, "bodymessage") == 0 && !jobEntryExists(rep, staleId)) {
  throw new KettleException("Job entry " + staleId + " not found in repository");
}
jobEntry.loadRep(rep, metaStore, staleId, databases, slaveServers);
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: verify the repository row exists before loadRep
ObjectId id = ...;
if (id == null || rep.getJobEntryAttributeString(id, "bodymessage") == null && !repJobEntryExists(rep, id)) {
  throw new KettleException("id_jobentry " + id + " missing from repository");
}
// plus a cheap connectivity probe:
rep.getConnection();

Type guard

boolean jobEntryRowExists(Repository rep, ObjectId id) {
  try (ResultSet rs = rep.getConnection().prepareStatement(
      "SELECT 1 FROM r_jobentry WHERE ID_JOBENTRY = " + id).executeQuery()) {
    return rs.next();
  } catch (Exception e) { return false; }
}

Try / catch

try {
  jobEntry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
} catch (KettleException e) {
  if (e.getCause() instanceof KettleDatabaseException) {
    logError("Repository DB failure loading Msgbox Info entry; check r_jobentry_attribute", e);
    // retry once after reconnect
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling loadRep(rep, metaStore, id_jobentry, databases, slaveServers) when rep.getJobEntryAttributeString() throws KettleDatabaseException — e.g. the r_jobentry_attribute table is missing/corrupt, the connection is down, or id_jobentry references a deleted row.

Common situations: Repository database (R_DB) schema drifted from the Kettle version; DB credentials/network outage mid-load; shared repository where another user deleted the job entry; corrupt r_jobentry_attribute records after a failed upgrade.

Related errors


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

Appendix: source

Thrown at plugins/msg-box-info/impl/src/main/java/org/pentaho/di/job/entries/msgboxinfo/JobEntryMsgBoxInfo.java:99

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      bodymessage = XMLHandler.getTagValue( entrynode, "bodymessage" );
      titremessage = XMLHandler.getTagValue( entrynode, "titremessage" );
    } catch ( Exception e ) {
      throw new KettleXMLException( "Unable to load job entry of type 'Msgbox Info' from XML node", e );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      bodymessage = rep.getJobEntryAttributeString( id_jobentry, "bodymessage" );
      titremessage = rep.getJobEntryAttributeString( id_jobentry, "titremessage" );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException(
        "Unable to load job entry of type 'Msgbox Info' from the repository with id_jobentry=" + 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(), "bodymessage", bodymessage );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "titremessage", titremessage );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save job entry of type 'Msgbox Info' to the repository for id_job="
        + id_job, dbe );
    }
  }

  /**

View on GitHub (pinned to f3058517a1)